首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特快专递如何收货?

特快专递如何收货?
EN

Stack Overflow用户
提问于 2016-04-05 08:04:33
回答 1查看 38关注 0票数 0

我是速递的新手,对它如何处理中间件有点困惑吗?基本上,我有两个中间工具,看起来像:

代码语言:javascript
复制
app.use(require('_/app/middlewares/errors/404'))
app.use(require('_/app/middlewares/errors/500'))

404

代码语言:javascript
复制
var log = require('_/log')

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

500

代码语言:javascript
复制
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')),如下所示:

代码语言:javascript
复制
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.在路线前后有什么区别吗?

EN

回答 1

Stack Overflow用户

发布于 2016-04-05 08:40:27

邮递员:在航线前后有什么区别吗?是。

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

图像表示为一个巨大的列表。从列表中的第一个元素开始,您已经定义了第一个中间件或路由,其次是第二个,依此类推。

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

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

现在,对于正在排序的事物的含义:您的404中间件只应该在定义了所有路由之后才使用。这样,当列表到达404中间件时,实际上还没有找到路由。

在中间件的末尾返回/发送结果/不调用next()可能会在流中造成问题。我不打算详细谈这件事,但要注意这一点。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36420484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档