我是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。 在路由之前或之后定义中间件有什么不同吗?
答案 0 :(得分:1)
P.S。在路由之前或之后定义中间件有什么不同吗? 是。
您注册中间件(和路由)的顺序有很多话要说。
图像表达为一个巨大的列表。从列表中的第一个元素开始,您有第一个已定义的中间件OR路由,下一个是第二个,等等。
当express收到请求时,它似乎与路由/中间件的路由/名称相匹配,如果它是命中,它会执行中间件/路由并可能等待“next()”调用。
因此,如果您有一个“/ test”路由,只有当您的请求与“/ test”匹配时才会执行。不同名称的路线显然不会被触发。中间件也可以有名称:app.use(“/ test”,middlewareA)。这也只会在请求“/ test”时触发。你这样做,所有请求(在路由命名空间内)将被触发app.use(middlewareA)。这就像一张通配符。
现在,关于订购事物的含义: 只有在定义了所有路由后才能使用您的404中间件。这样,当列表到达404中间件时,实际上没有找到路由。
在中间件结束时返回/发送结果/不调用next()都会在您的流程中产生问题。我不会详细介绍这个,但请注意它。
我猜你自己的中间件是在404中间件之后添加的。这可能就是问题所在。如果没有,你应该放弃更多的代码,这样我们就可以更好地了解一下。但请记住,秩序就是一切:)