While working as automation QA using NodeJS, I always have big interest in how to build up a web application and recently I have decided to give it a try with the de-facto Express framework.

— -

Starting with the basic guide from Mozilla (https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs), I find it very coherent and easy to follow. But there is a trouble that the guide is using the callback style which is both convenient and troublesome to use in my opinion.

// Display list of all Books.
exports.book_list = function(req, res, next) {
Book.find({}, ‘title author’)
.exec(function (err, list_books) {
if (err) { return next(err); }
//Successful, so render
res.render(‘book_list’, { title: ‘Book List’, book_list: list_books });


Besides, I am using Promise and async-await style for my automation test suites at RealStake, so I try converting the guide to the latter style for easier controlling the code flow.

module.exports = {
getList: async (req, res, next) => {
try {
const bookInstanceList = await BookInstance.find({})
res.render(‘bookInstanceList’, {
title: ‘Book Instance List’,
} catch (err) {

And the experience is quite amazing because I can achieve both the basic understanding of how Express works and understand more about callback using.

— -

After finishing the guide, I try to relate to the current project at my company and plan to add more features like JWT authentication, Redis storage, etc. to explore more on building a real application. Then I make up my own Trello board (https://trello.com/b/K0mY1Jpo/learn-express) to define and monitor what I have been doing and what I will implement.

By making use of the Trello board, it is easier for me to control my learning flow. It also makes me feel more organized :D

So far I have been able to implement more routes to my small local library app such as:
- JWT authentication for log in
- blacklist JWT token for log out
- register new account and send activation email via Sendgrid
- …

— -

And for deployment, I already have some experience with using Zeit for my automation workflow with Asana (https://dev.to/trannguyenhung011086/how-i-sync-github-pull-request-status-to-asana-task-flow-nl2).

So at first, I deployed my app as a normal Express server.

const config = require(‘./common/config’);
const mongo = require(‘./loaders/mongo’);
const redis = require(‘./loaders/redis’);
const app = require(‘./loaders/express’);
app.listen(config.port, () =>
console.log(`App listening on port ${config.port}`),

Then I found an article about using Zeit for serveless functions (https://medium.com/@bmikkelsen22/designing-a-serverless-express-js-api-using-zeit-now-6e52aa962235) and tried to change my code a bit.

It is quite surprising that such task does not take so much effort because Zeit already see an Express app as a function by using **@now/node** option for deployment. I just need to map routes to those functions.

// now.json
“version”: 2,
“name”: “learn-express”,
“builds”: [{ “src”: “/api/*.js”, “use”: “@now/node” }],
“routes”: [
{ “src”: “/catalog”, “dest”: “/api/catalog.js” },
{ “src”: “/catalog(/.*)”, “dest”: “/api/catalog.js” },
{ “src”: “/user(/.*)”, “dest”: “/api/user.js” },
{ “src”: “(/.*)”, “dest”: “/api/home.js” }
// api/catalog.js
const app = require(‘./setup’);
const catalogRouter = require(‘../routes/catalogRoute’);
const authMiddleware = require(‘../middlewares/authMiddleware’);
app.use(‘*’, (req, res) => {
res.status(404).send(‘Page not found!’);
module.exports = app;

The whole code can be found at https://github.com/trannguyenhung011086/learn-express.

— -

To sum up, by learning to build an application with Express, I gain more insight in development works and feel really hooked with pushing my Node JS skills as far as possible. And I will definitely continue exploring more in the path of building web application.

From translator -> Manual QC Engineer -> Automation QA Engineer -> NodeJS Developer -> yearning to learn more

From translator -> Manual QC Engineer -> Automation QA Engineer -> NodeJS Developer -> yearning to learn more