0

I have multiple routes defined in my routes file and I want to call a function on every routes before it calls the controller. Is there a way?

const express = require('express');
const userController = require('../controllers/user');
const chatController = require('../controllers/chats');
const fileUploadController = require('../controllers/fileUploader');
const instagram = require('../controllers/instagram');

const router = express.Router();

/* Express Routes */
router.post('/login', userController.authenticate);
router.post('/verifyotp', userController.handleTwoFactor);
router.post('/startcheckpoint', userController.startCheckpoint);
router.post('/handle-checkpoint', userController.handleCheckpoint);
router.post('/logout', userController.logout);
router.get('/chatlist', chatController.getChatList);
router.post('/send-message', chatController.sendNewMessage);
router.get('/get-single-chat', chatController.getSingleChat);
router.post('/getoldmessages', chatController.getOlderMessage);
router.post('/uploadfile', fileUploadController.fileUploader);
router.post('/sendaudio', fileUploadController.sendAudio);
router.get('/searchuser', chatController.searchUser);
router.post('/markasread', chatController.markAsRead);
router.post('/muteuser', chatController.muteUser);
router.post('/blockunblockuser', chatController.blockUnblockUser);
router.post('/deletechat', chatController.deleteChat);
router.post('/unsendmessage', chatController.unsendMessage);
router.get('/getunfollowers', chatController.getUnfollowers);
router.post('/unfollow', chatController.unfollowUser);
module.exports = router;
Papu Kumar
  • 43
  • 7
  • you can chain middleware functions with a comma: `router.post('/login', fn1, fn2, fn3, userController.authenticate);` – fedesc Jul 27 '20 at 10:34

2 Answers2

2

If you want to call a function on every route before it calls the controller you can do this.

const router = express.Router();

router.use(function (req, res, next) {
  console.log('this will be called for every route')
  next()
})
/* Express Routes */
dulebov.artem
  • 733
  • 1
  • 4
  • 15
  • 1
    This is a better answer than mine since this is creating the middleware on the router itself, rather than per route like my answer is. However, if you're thinking of running the same middleware on different routers, then my answer is probably better. – undefined Jul 27 '20 at 10:57
1

Yes, Express is designed with middlewares in mind. You can read about middlewares on the docs here.

Here's a quick example using your code that might help:

function middleware (req, res, next) {
  console.log('I run before the controller action!')

  next()
}

router.post('/login', middleware, userController.authenticate)

You can even optionally provide the middleware (second argument) as an array instead if you wanted to separate some of your middleware concerns out into multiple different middlewares.

function firstMiddleware (req, res, next) {
  console.log('I run before the second middleware!')

  next()
}

function secondMiddleware (req, res, next) {
  console.log('I run after the first middleware but before the controller action!')

  next()
}

router.post('/login', [firstMiddleware, secondMiddlware], userController.authenticate)
undefined
  • 469
  • 2
  • 10
  • 23