- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道在 ExpressJS 处理程序中,可以在 res.send
之后调用 next
,但是 res.send
在任何情况下都会“自动”调用 next
吗?
我有以下代码
const express = require('express');
var app = express();
app.get('/', (req, res, next) => {
console.log('in route handler')
res.send('Hello World')
});
app.use((req,res, next) => {
console.log('in middleware')
console.log('...........')
})
app.listen(process.env.PORT || 8080)
我的控制台日志是
in route handler
in middleware
...........
如果我确实在 res.send
之后明确地调用了 next
我得到了
in route handler
in middleware
...........
in middleware
...........
因此看起来中间件被调用了两次。
这是为什么?是不是因为中间件在某种时尚中也被称为“直接”,而不管路线如何?也就是说,它只是总是被调用,即使它在路由处理程序之后也是如此?但我认为如果它在路由处理程序之后,要到达中间件,它前面的路由处理程序必须调用 next
,如此处 https://derickbailey.com/2016/05/09/in-what-order-does-my-express-js-middleware-execute/ ,它说“事实证明添加中间件的顺序很重要。并且由于第二个'use'方法是在'get'处理程序之后添加的,所以它永远不会被调用。'get'处理程序使呈现页面时的中间件,防止处理任何进一步的中间件。”
Express 版本 4.16.0,Node 版本 11.2.0
感谢任何澄清!
最佳答案
Why is this?
这是因为浏览器发送了一个额外的请求来获取favicon;当您转到 localhost:8080
时,chrome(或 firefox)向 /
发送一个 get
请求,因此您的服务器匹配此路由并记录:
in route handler
紧接着它向 /favicon.ico
发送第二个 get
请求,但您的服务器不匹配任何路由。它继续到路由后安装的中间件,因此记录:
in middleware
...........
当然,通过调用 next()
,您已经在上述两个请求之后显式调用了您的中间件,因此:
in route handler
in middleware
...........
in middleware
...........
But I thought if it was after the route handlers, to reach the middleware the route handler preceding it has to call next
当然你是对的。将 serve-favicon
中间件添加到您的应用程序,除非没有任何路由不匹配,否则您的自定义中间件不会在不显式调用 next()
的情况下被调用:
const express = require('express');
var favicon = require('serve-favicon')
var path = require('path')
var app = express()
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
app.get('/', (req, res, next) => {
console.log('in route handler')
res.send('Hello World')
});
app.use((req,res, next) => {
console.log('in middleware')
console.log('...........')
})
app.listen(process.env.PORT || 8080)
顺便说一句,这个安装在所有路由之后的中间件是处理 404 的合适位置,因为如果我们到了这一点,我们的应用程序路由都不会匹配。
关于node.js - Express JS 处理程序中的 res.send() 是否会自动调用 next()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53618973/
我正在使用 express并试图通过管道传输 req到远程服务器进行处理,然后通过 res 将结果通过管道传回客户端.它运行良好,但有时我认为 res由 connect-timeout 的操作结束,导
我正在尝试使用 fetch 进行简单的发布请求: const headers = new Headers({ Accept: 'application/json', 'Content-Type
我偶然发现了一个代码示例 here .引起我注意的行(跳过所有其他行): { ... void *res; ... s = pthread_join(tinfo[tnum].thread_id
我有一个 NodeJS 代码,使用请求模块向服务器发出请求。如果我使用“http.request”,代码工作正常,但在 res.on() 上显示错误使用请求来调用电话。以下是显示错误的部分: cons
我想知道这两种不同的方法在 expressjs 中是否相同? res.statusCode = 500; return res.json({ status: "error" }); 或者 r
我正在尝试在 Node.js 中制作简单的 ftp 客户端。一切正常,但我不知道如何在我的 Jade 模板中编写“singleFile.name”。 app.post('/ftp/login', fu
在frameworks/base下有这个xml文件。 /frameworks/base/core/res/res/layout/simple_dropdown_item_2line.xml 如何在我自
我是 odoo v8 的新手,我无法理解 res_partner 和 res_users 表之间的关系以及与 hr_employee 表之间的关系,它们都相关吗? 最佳答案 res.partner之间
我正在开发一个用于用户登录的小部件。基本上,当他们输入有效的帐户详细信息时,我希望它呈现相同的页面(使用 Handlebars )并声明“帐户已成功验证”之类的内容,然后 3 秒后重定向用户。 这是我
我有这种形式的数据 [ { device_id: '12335', timestamp: '2018-05-14T08:31:23.000Z', temperatur: 21,
我是 android 开发的新手,您可能会从我的问题中看出这一点。我发现我有一个 res/menu 文件夹和一个 res/layout 文件夹。它们都包含每个 Activity 的 XML 文件。但是
当我尝试按照指南中的说明在 res/menu 中创建新的菜单资源文件时,该文件夹不存在。 res/xml 也不是。有人可以告诉我如何解决这个问题吗?我尝试创建文件夹,但它不允许我这样做 最佳答案 如果
调用有什么区别: res.flushBuffer(); 对比 res.getOutputStream().flush(); 这些方法是否刷新相同的缓冲区? 如果是这样,你能告诉我这个缓冲区是如何由
为什么以下不起作用? res.send({ successMessage: 'Task saved successfully.' }); res.redirect('/'); 我基本上需要 A
我正在尝试确定是否可以同时调用 res.send(data) 和 res.render('reports')。 为了进一步详细解释,当我路由到“/reports”时,首先在我的服务器端我对返回 jso
app.get('/p/:tagId', function(req, res) { res.send("tagId is set to " + req.param("tagId")); }); 上
我在使用express.js 时遇到一些问题。我想在第一次请求时渲染我的模板,然后从路由中获取一些数据。我的路由如下所示: app.use(function (req, res, next) { r
我想根据屏幕尺寸加载 dimens.xml,但无论屏幕尺寸如何都使用相同的颜色。 我有以下目录结构 res res/values colors.xml res/values-small d
我有一张图片,rectangle.png。它的尺寸是 75x197。它位于 res/drawable 和 res/drawable-xhdpi。它在像这样的网格布局中显示了很多次(截图来自 Nexus
我很好奇返回响应和仅创建响应的区别。 我见过大量使用 return res.status(xxx).json(x) 的代码示例和res.status(xxx).json(x) . 谁能详细解释一下两者
我是一名优秀的程序员,十分优秀!