【问题标题】:Express middleware not being calledExpress 中间件没有被调用
【发布时间】:2017-01-04 08:58:16
【问题描述】:

我正在使用快速路由器在我的应用程序中构建路由,并且我正在尝试将自定义中间件应用于每个路由,因此只有在为该特定路由器命中 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 的 require 语句都返回一个像这样的路由器:

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;

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

【问题讨论】:

  • 实际上,不同的调用并没有使用相同的路由器实例。您可能认为这是因为文件顶部有对 express router 的引用。这是我的一个错误,因为它现在是一个未使用的变量。对 registerController 的每次调用都将路由器作为它的第三个参数,并且在每次调用中我都传入了 require 语句的返回值。所有这些 require 语句都返回一个不同的快速路由器实例。

标签: node.js express routing middleware


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    Express 按照添加到路由器/应用程序的顺序评估路由。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2023-03-20
      • 2021-02-23
      相关资源
      最近更新 更多