The express application is still the boilerplate created by express generator. Now let’s look into the existing code and use the domino-db package. First we have to understand express a little bit better. I won’t go deeply into details, because there are many tutorials available, and the documentation is really awesome.
Overview
Directory structure
/domino-express
|-app
|-app.js
|-bin
|-...
|-public
|-...
|-routes
|-...
|-views
|-...
app.js
This is the main application. It contains the configuration of the application and global modules (like used the middleware, global route handlers, etc.). At the moment we don’t need to change anything here.
/bin
This folder contains the starting script for the application.
/public
Contains publicly accessible static resources like images, stylesheets, etc.
/routes
The handling for existing routes, which means how the application should process incoming requests.
/views
Contains the templates for the generated output. We are using Jade as our template engine.
The boilerplate
The first thing to look at is the /routes/index.js file. Just open it in Atom, and see what the express generator created for us:
The first line loads the express package and gives access to it. The next line gives us access to the router, which then is used to define a handle for all incoming requests on the application root (http://localhost:3000/).
When this route is called, the defined function renders the response using the view template ‚index‘ (which can be found in the /views folder). The variables used in the template are contained in the object handed over as second parameter.
The last line exports the router instance and gives access to it outside of our module. Just for a better understanding: Everything in this file (aka module) is private, and here it is defined what is public to the rest of our express application. For more details, have a look here: https://www.sitepoint.com/understanding-module-exports-exports-node-js/
Change to ES6
After changing everything as proposed by the editor, the code should now look like this:
const express = require('express');
const router = express.Router();
/* GET home page. */
router.get('/', (req, res) => {
res.render('index', { title: 'Express' });
});
module.exports = router;
Now we add the requirement for the domino-db package:
const { useServer } = require('@domino/domino-db');
The curly brackets notation is used to „import“ only the useServer element from the domino-db package.
Then we add the configuration for our Domino backend (shamelessly copied from the example in the dev pack):
const serverConfig = {
hostName: 'your.server.com', // Host name of your server
connection: {
port: '3002', // Proton port on your server
},
};
const databaseConfig = {
filePath: 'node-demo.nsf', // The database file name
};
const createOptions = {
documents: [
{
Form: 'Contact',
FirstName: 'Aaron',
LastName: 'Aardman',
City: 'Arlington',
State: 'MA',
},
{
Form: 'Contact',
FirstName: 'Brian',
LastName: 'Zelnick',
City: 'Chelmsford',
State: 'MA',
},
],
};
And now we add the connection of the database query when our base path is accessed:
router.get('/', (req, res) => {
useServer(serverConfig).then(
async server => {
const database = await server.useDatabase(databaseConfig);
const response = await database.bulkCreateDocuments(createOptions);
// Display the new document UNIDs
const unids = response.documents.map(doc => doc['@unid']);
res.render('index', { title: 'Express', result: `Documents created: ${unids}` });
});
});
Before we get into the details of this code, let’s start our application with npm start.After accessing the URL of the application http://localhost:3000, nothing happens.
Just some console output tells us that we need some error handling when our Domino server is not reachble.
GET / - - ms - -
(node:13268) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 6): DominoDbError: gRPC client error
This topic and more details about the domino-db module will be covered in the next post.