Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

256
Views
Execute middleware on every route call

In my Express application I implement routes in routes.ts:

    var Router = express.Router();

    Router.route('/models/:modelId')
      .get(function (req, res) {
          service.setParameter(req)
          service.get(req,res)
    });
 
     Router.route('/models/:modelId')
      .post(function (req, res) {
          service.setParameter(req)
          service.post(req,res)
    });

And express.ts:

    export const App = express()

    App.use(express.json())
    App.use(express.urlencoded({ extended: true }))
    App.use(helmet())

    App.use('/', Router)

At each router call I'd like to execute a piece of code service.setParameter(req) that gets particular parameter from 'params', but I don't want to add to each router method explicitly.

I tried adding it at as middleware before and after Router

    App.use('/', Router)

    App.use(function(req, res, next){
      service.setParameter(req)
      next()
    })

But if I define it before Router then route hasn't been set yet, and I don't get the parameter I want, and if I define it after, then middleware is not executed.

How can execute service.setParameter(req) in a generic way so that it applies to all the routes?

over 4 years ago · Santiago Trujillo
4 answers
Answer question

0

You need to put your custom middleware between the context route and your router inside app.use(..) :

 const router = express.Router(); router.post('/', (req, res) => { service.post(req,res); }); router.get('/', (req, res) => { service.get(req,res) }); app.use('/models', (req, res, next) => { service.setParameter(req); next(); }, router);

With the code above, the middleware will be executed for all requests to '/models' .

over 4 years ago · Santiago Trujillo Report

0

You can use app.use(async (req,res,next) => {...}) in order to declare a middleware that executes in all the requests, if you want this middleware to be called first, it must be declare before than your routes, the middleware have to call next() in order to continue with the execution flow, if you want to be called at the end of you request, you have to put at the end of your declarations but before of the error middleware, in that approach each route have to call next() at the end of your function.

First approach

const express = require('express');
const app = express();
const router = express.Router();
router.post('/', async (req, res) => {
    await service.post(req,res);
});

router.get('/', async (req, res) => {
    await service.get(req,res)
});

app.use((req,res,next) => {
   console.log("always called");
   next();
});
app.use('/',router);

Second approach

const express = require('express');
const app = express();
const router = express.Router();
router.post('/', async (req, res, next) => {
    await service.post(req,res);
    next();
});

router.get('/', async (req, res, next) => {
    await service.get(req,res);
    next();
});

app.use('/',router);
app.use((req,res) => {
   console.log("always called");
});
over 4 years ago · Santiago Trujillo Report

0

In express.ts file, you can add a middleware that would do it before mounding the Router, and then just procced forward with next(). You can do it like this:

App.use('/*', (req, res, next) => {
  service.setParameter(req);
  next();
});

App.use('/', Router)
over 4 years ago · Santiago Trujillo Report

0

Thanks for all the answers, they helped me better understand how routing works on Express.

I found another solution, which I think works best in my case - using Router.all() method:

const setRequest = function(req, res, next){
  logger.setRequest(request)
  next()
}

Router.route('/models/:model_id')
.all(setRequest)
.get(function (req, res) {service.execute()})
.put(function (req, res) {service.execute()})
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!