gpt4 book ai didi

node.js - 为什么在 Express 路线运行后我无法调用 `next`?

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:42 25 4
gpt4 key购买 nike

我有一个像这样的简单路线:

// This is just a health check
const endpoint = (req, res, next) => {
res.json({
status: 'ok',
});
next();
};

router.get('/', endpoint);

我从 Express 收到错误:发送后无法设置 header 。。即使我接下来没有其他可能运行的中间件,或者我的 next 中间件实际上什么都不做并且是一个空函数,也是如此。

关于中间件和 next 的工作方式,我缺少什么?

最佳答案

可能存在几个问题:

最后你有一个 404 处理程序(我们都这样做)并且只是被忽略了。例如:

app.get('/path', (req, res, next) => {
res.json({ greet: "Welcome!" })
next() // <-- calling next middleware
})

// set up a 404 handler at the end
app.use((req, res) => {
res.status(404).send('Opps! Not Found');
})

这会导致错误错误:发送后无法设置 header 。因为您的 404 处理程序正在发送响应。

或者您偶然发现了一个未知功能(或者简单地说,您的其中一条路线未按预期工作,可能是设计错误)。考虑以下路线:

app.get('/path/:id', (req, res, next) => {
res.json({ message: "Welcome!" });
next() // <-- calling next middleware
})

app.get('/path/test', (req, res, next) => {
res.json({ message: "Welcome!" });
})

如果您的请求路径是 /path/test,则在 /path/:id 路由中调用 next 会导致错误(这通常会建议更好的路由实现)

理解中间件next的一个简单方法与switch语句的工作方式有关:

function test(x) {
switch (x) {
case 'Oranges':
console.log('Orange juice');
break;
case 'Mangoes': // fall through
case 'Papayas':
console.log('Pickles');
break;
case 'Banana':
console.log('Milkshake');
// forgot the break
case 'Apple':
console.log('Apple Pie')
break;
default:
console.log('Sorry, no ' + x + '.');
}
}

test('Banana')

调用next就像switch语句的fall through一样,也执行下一个case。

因此,当您在一条路由中调用 nextrequest 继续匹配您发送响应的另一条route(意外匹配)时,您会发现自己因错误而打脸。

关于node.js - 为什么在 Express 路线运行后我无法调用 `next`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245702/

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