未调用Express中间件

时间:2016-08-28 02:09:43

标签: node.js express routing middleware

我正在使用快速路由器在我的应用程序中构建路由,并且我正在尝试将自定义中间件应用于每个路由,因此仅当针对该特定路由器的URL被命中时才会调用中间件。这是我的代码:

const express = require('express');
const router = express.Router();
const authentication = require('./helpers/authentication');

const registerController = (app, path, router, middleware) => {
  middleware.forEach((routerMiddleware) => {
    router.use(routerMiddleware);
  });
  app.use(path, router);
};

const testMiddleware = (request, response, next) => {
  console.log(request.originalUrl);
  next();
};

module.exports = {
  init: (app) => {
    registerController(app, '/auth', require('./authenticationController'), [testMiddleware]);
    registerController(app, '/customer', require('./customerController'), [authentication, testMiddleware]);
    registerController(app, '/filter', require('./filterController'), [authentication, testMiddleware]);
    registerController(app, '/', require('./homeController'), [testMiddleware]);
    registerController(app, '/inventory', require('./inventoryController'), [authentication, testMiddleware]);
    registerController(app, '/settings', require('./settingsController'), [authentication, testMiddleware]);
  }
};

我已经构建了registerController方法,因此我可以将不同配置的中间件分配给不同的路由器。每个需要语句的拉入文件名xxxController都会返回一个这样的路由器:

const router = require('express').Router();
const fs = require('fs');

router.get('/', (request, response) => {
  const file = fs.readFileSync(__dirname + '/../index.html', "utf8");
  response.send(file);
});

module.exports = router;

我添加了测试中间件,看看最简单的中间件是否可行,但它没有被调用。我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

构建Express路由器时,设置路由和添加中间件的顺序非常重要。例如,如果添加路由,然后添加中间件,则添加更多路由,只有添加中间件后添加的路由才会调用中间件。在设置中间件之前设置的第一条路由不会触发要调用的中间件。

所以上面我的代码的问题是我正在构建所有路由然后添加中间件,假设添加到路由器的所有中间件都将被调用所有路由。

解决方案是重构并确保我在每个路由器的开头添加中间件。

答案 1 :(得分:1)

您没有看到routerMiddleware被使用的原因是您在控制器文件中有router.get()表示已经响应该请求。现在,如果您有POST请求,那么然后将调用您的routerMiddleware,因为您的控制器文件中没有router.post()

Express按照路由/ app的添加顺序评估路由。