gpt4 book ai didi

node.js - Express JS 处理程序中的 res.send() 是否会自动调用 next()?

转载 作者:搜寻专家 更新时间:2023-10-31 23:50:20 25 4
gpt4 key购买 nike

我知道在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com