我是速递的新手,对它如何处理中间件有点困惑吗?基本上,我有两个中间工具,看起来像:
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.在路线前后有什么区别吗?
发布于 2016-04-05 08:40:27
邮递员:在航线前后有什么区别吗?是。
您注册您的中间件(和路线)的顺序有很多要说的。
图像表示为一个巨大的列表。从列表中的第一个元素开始,您已经定义了第一个中间件或路由,其次是第二个,依此类推。
当express收到请求时,它似乎与您的路由/路由/中间件名称相匹配,如果是命中,它将执行中间件/路由,并可能等待"next()“调用。
因此,如果您有一个路由"/test“,只有当您有一个与"/test”匹配的请求时,它才会被执行。不同名称的路线显然不会被触发。中间件也可以有名称: app.use("/test",middlewareA)。这也只有在请求"/test“时才会触发。按照您的方式,所有请求(在路由命名空间内)都将被触发app.use(middlewareA)。就像通配符。
现在,对于正在排序的事物的含义:您的404中间件只应该在定义了所有路由之后才使用。这样,当列表到达404中间件时,实际上还没有找到路由。
在中间件的末尾返回/发送结果/不调用next()可能会在流中造成问题。我不打算详细谈这件事,但要注意这一点。
我猜您自己的中间件是在404中间件之后添加的。这可能就是问题所在。如果没有,您应该交出更多的代码,以便我们可以更好地查看。但请记住,秩序是一切:)
https://stackoverflow.com/questions/36420484
复制相似问题