node express - 中间顺序是否重要?得到错误

时间:2016-06-29 02:18:07

标签: node.js express middleware

下面的代码给出了一个错误:错误:发送后无法设置标头。 如果我把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');
});

2 个答案:

答案 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');
});