0
votes

I am working a REST web application backend and I got some problem when linking my middleware together.

For example, the stack of the middlewares that each request has to go through is like [before1, service, after1], and here's the code for the middleware "before1", this is just the code I used for testing:

'use strict';

var express = require('express');
var router = express.Router();

router.use(function(request, response, next){
        console.log('This is middleware BEFORE1');
        var success = true
        if (!success){
            // Go the logging middleware underneath
            next();

        }
        else{
            // Go to the 'service' middleware
            next('route');
        }
    })

router.use(function(request, response, next){
        console.log('This is middleware LOGGING');
        response.sendStatus(400);
        response.end();
    })


module.exports = router;

The above code is simply saying if the 'before1' succeeds, it should go straight to call 'service' middleware, and otherwise go to the logging middleware underneath and end the request. But my problem is that I can't figure out a way that it could skip the logging middleware, I searched and found next('route') could help, but it didn't work here. What have I missed?

Thanks in advance!

EDIT:

Or more preferably, it's the best if I can issue an error in any of my middleware and handle all types of errors properly using a error handler middleware.

The skeleton of my top level code is the following:

// An array of middleware to be executed asynchronously
operations = [before1, service, before2];

async.series(operations, function(err) {
        if(err) {
        // one of the functions passed back an error so handle it here
            console.log('Handling error!!!!');
            res.end();
            // return next(err);
        }
        console.log('middleware get executed');
        // no errors so pass control back to express
        next();
    });

But I am not sure How should change my middlewares accordingly in order to do that.

1

1 Answers

0
votes

next is a node-style callback, which means fn(err, ..), so your next('route') will only work to invoke errorhandlers.

You can implement your series directly by supplying an array of functions to the route, and using an express error handler as the catch all (see http://expressjs.com/guide/error-handling.html)