找不到路由时表示 4 中间件(未调用最终处理程序):如何检查它?

Express 4 middleware when route is not found (finalhandler not called): how to check for it?

我设置了以下 Express 4 中间件堆栈:

const app = express();
const router = express.Router();
router.get('/test', testResponse);
app.use(checkAccessToken);
app.use(router);
app.use(sendResponse);
//Error Handling
app.use(function(err,req,res,next) {
  // ... Do something here
});

function sendResponse(req, res) {
  res.json({
    data: res.locals.data,
    meta: res.locals.meta
  });
}

如果我用不存在的路由调用服务器(比如 GET /something)函数 sendResponse 就在路由器处理程序被调用之后,调用者得到一个标准响应而不是通常的消息 "Cannot GET /something", 来自 finalhandler 模块。
我认为应该调用错误处理程序,但事实并非如此。
有没有办法在找不到路由时强制路由器发出错误,或者在路由不匹配时检查标准响应处理程序?
我知道我可以在 res.locals 中为任何匹配的路由添加一个值,并在标准响应处理程序中检查它,但我想使用 "right" 方式来做到这一点,而不是而不是使用解决方法。

错误处理程序是为了防止出现未捕获的错误。没有匹配的路由不是错误。 我假设您的路由器调用的中间件不会 return 对客户端的响应,因此您需要 sendResponse 中间件。 您可以在路由器中间件中更改它和 return 对客户端的响应,并且在路由器使用中间件后 return 找不到路由错误。如果你到达这个中间件,则意味着没有匹配的路由。

我使用以下逻辑:

...

app.use(require('./routes/eInvoice'))
app.use(require('./routes/oauth2/client'))

// Status 404 (Error) middleware
app.use('*', function(req,res){
    res.status(404)
    if(req.headers.accept.indexOf('html'))
        res.render('404', { url: req.protocol + '://' + req.get('host') + req.originalUrl })
    else
        res.send("URL cannot found")
})

// Error handling
app.use(require("./middlewares/errorHandler"))

app.listen(config.operating.port, function() {
    console.log('Operating Server is listening HTTP port ' + config.operating.port)
})

希望这对您有所帮助..

您可以检查req.route

var express = require('express');
var app = express();
app.use(require('body-parser').urlencoded({extended: false}));

const router = express.Router();

router.use(function(req, res, next) {
    app.locals.test = 0;  
    next();
});

router.get('/', function(req, res, next) {
    app.locals.test = 10;  
    next();
});

router.get('/about', function(req, res, next) {
    app.locals.test = 20;  
    next();
});

router.use(function(req, res, next) {
    if (!req.route)
        return next (new Error('404'));  
    next();
});

router.use(function(err, req, res, next){
    res.send(err.message);
})

router.use(function(req, res){
    res.send(app.locals.test + '');
});

app.use(router);

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});