下面的代码给出了一个错误:错误:发送后无法设置标头。 如果我把app.use('/ special / ...放在app.use之前('/'...它没有给我一个错误 - 1.据我所知,在使用app.use时,顺序确实很重要,因为当我使用app.get时,程序看起来不像'/或'/ special /之后的任何内容,为什么我会收到错误? 另外当我把app.use('/ special /'首先我仍然没有看到“第一”和第二个“但只有第一个 - 即使我使用下一个.. 谁能解释一下? 谢谢!
这是什么意思?
var express=require ('express');
var app=express();
app.use('/',function(req,res,next){
res.send('first');
next();
});
app.use('/special/',function(req,res,next){
res.send('second');
next();
});
app.listen(3000, function(){
console.log('Server listening');
});
答案 0 :(得分:1)
在您的情况下,它与订单无关,但是当您需要一个资源时,您无法两次调用 res.send('some_result'),您可以详细检查Stackoverflow。
另外,当您使用 app.use()向系统添加中间件时,Express会使用正则表达式来匹配您的请求网址,因此当您拥有以下代码时:
app.use('/',function(req,res,next){
res.send('first');
next();
});
以'/'开头的所有请求(无论HTTP动词)都符合要求。
最后请求如下:
POST / special
将调用两个中间件。
答案 1 :(得分:1)
两条路线
app.use('/',function(req,res,next){
res.send('first');
next();
});
app.use('/special/',function(req,res,next){
res.send('second');
next();
});
都匹配网址/special
。这就是为什么它们都由节点执行的原因。由于第一个路由中的res.send()
关闭来自服务器的http响应,因此第二个路由器中的res.send()
会抛出错误,因为它尝试设置标头(例如内容长度) )第一条路线的输出已经发送。
始终将更具体的路线放在首位,以便完全达到。如果您定义的第一条路线与/
匹配,则不会调用其他路线。
另外,如果要在路由中调用res.send(),请不要调用next()。最佳实践:只应在不发送响应的中间件中调用next()。
可能的解决方案如下:
var express=require ('express');
var app=express();
app.use('/special/',function(req,res){
res.send('second');
});
app.use('/',function(req,res){
res.send('first');
});
app.listen(3000, function(){
console.log('Server listening');
});