【问题标题】:How Express recorgonizes middlewares?Express 如何重新识别中间件?
【发布时间】:2016-04-05 08:04:33
【问题描述】:

我是 Express 的新手,对它如何处理中间件有点困惑?所以基本上我有两个中间件,看起来像:

app.use(require('_/app/middlewares/errors/404'))
app.use(require('_/app/middlewares/errors/500'))

404

var log = require('_/log')

module.exports = function (req, res, next) {
    log.warn('page not found', req.url)
    res.status(404).render('errors/404')
}

500

var log = require('_/log')

module.exports = function (er, req, res, next) {
    log.error(er.message)

    res.locals.error = er
    res.status(500).render('errors/500')
}

所以现在我想添加我的自定义中间件app.use(require('_/app/middleware/shareLocals')),它看起来像:

module.exports = function (req, res, next) {
    res.locals.base_url = req.protocol + '://' + req.get('host');

    next();
}

主要问题是现在当我尝试使用base_url 时,我得到404 错误...

那么Express 是如何理解中间件的作用的呢?那就是我的中间件和 404 之间没有视觉上的区别:

  • 它接收相同的参数
  • 里面没有if's,只是抛出404错误

感觉Express 中的中间件是针对错误(将 err 作为第一个参数除外)和 404(当没有第一个 err 时)制作的......

附言 在路由之前或之后定义中间件有什么区别吗?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    附:在路由之前或之后定义中间件有什么区别吗? 是的。

    您注册中间件(和路由)的顺序有很多话要说。

    图像表达为一个巨大的列表。从列表中的第一个元素开始,您拥有您定义的第一个中间件 OR 路由,接下来是第二个,依此类推。

    当 express 收到请求时,它似乎与您的路由/路由/中间件的名称匹配,如果命中,它会执行中间件/路由并可能等待“next()”调用。

    所以如果你有一个路由“/test”,它只会在你有一个匹配“/test”的请求时执行。显然不会触发具有不同名称的路线。中间件也可以有名字:app.use("/test", middlewareA)。这也只会在请求“/test”时触发。你这样做的方式,所有请求(在路由命名空间内)都将被触发 app.use(middlewareA)。这就像一个通配符。

    现在,关于订购的东西的含义: 您的 404 中间件只能在定义所有路由之后使用。这样,当列表到达 404 中间件时,实际上并没有找到任何路由。

    在中间件结束时返回/发送结果/不调用 next() 都可能在您的流程中产生问题。我不会对此进行详细介绍,但请注意。

    我猜你自己的中间件是在 404 中间件之后添加的。这大概就是问题所在。如果没有,您应该交出更多代码,以便我们更好地查看。但请记住,顺序就是一切:)

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多