Express如何重组中间件?

时间:2016-04-05 08:04:34

标签: node.js express

我是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中的中间件是出错的(当排除错误为第一个参数时)和404(当没有第一个错误时)......

P.S。 在路由之前或之后定义中间件有什么不同吗?

1 个答案:

答案 0 :(得分:1)

  

P.S。在路由之前或之后定义中间件有什么不同吗?   是。

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

图像表达为一个巨大的列表。从列表中的第一个元素开始,您有第一个已定义的中间件OR路由,下一个是第二个,等等。

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

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

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

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

我猜你自己的中间件是在404中间件之后添加的。这可能就是问题所在。如果没有,你应该放弃更多的代码,这样我们就可以更好地了解一下。但请记住,秩序就是一切:)