请问express的app use 方法的一个问题
发布于 8 年前 作者 profangong 3998 次浏览 来自 问答

代码如下:我的理解使用use注册中间件,在每次请求都应该可以捕获到请求,但是下面代码只能在第一次访问是可以捕获到请问。但是第二次刷新页面没有输出。请前辈们帮我看看。谢谢。 var http = require(“http”); var express = require(“express”); var app = express(); app.set(‘port’,3334);

//定义路由 app.get(’/’,function(req,res){ res.send(‘OK’); });

app.use(function(req,res,next){ console.log('middleware 1 '); next(); });

app.use(function(req,res,next){ console.log(‘middleware 2’); // 注释下面这句就可以了,每次刷新都能捕获到。 next(); });

http.createServer(app).listen(app.set(‘port’),function(){ console.log(‘nodejs start listen 3337 port!’); })

6 回复

代码运行到res.send(‘OK’)就会终止

@jingsam 是的,我的意思是每次请求,中间件都应该捕获到,但是如果第二个中间件的处理函数有next(), 在第二次请求是就没有效果,两个中间件都捕获不了请求,第一次请求是正常的。如果把里面的next()注释掉,就正常了,不知道这是怎么回事。

@profangong

  1. app.set(‘port’,3334);console.log(‘nodejs start listen 3337 port!’);,这两个端口…坑啊…
  2. 我的运行环境是node: v6.2.0express: 4.13.1 运行你的源代码结果:中间件一次都没有调用成功,运行完app.get()函数就结束了。 (运行测试结果跟你的不一样,可能是运行环境导致,你对比一下谁的版本新就以谁的为准吧。)
  3. 建议你更改代码进行测试,更改完后,我的运行结果是符合预期的。
  • 更改app.get()为以下代码,增加next参数和next()函数调用
app.get('/',function(req,res, next){
  res.send('OK');
  next();
});
  • 更改第二个app.use()为以下代码,增加res.end()调用。(这个其实不加也能跑,但我个人觉得结束就该通知client数据发送结束事件)
app.use(function(req,res,next){
  console.log('middleware 2');
  res.end();
});

@IvanYoung-GitHub 非常感谢你的回答,抱歉弄了一个坑。 我这里还是没有理解express的中间件的next() 方法。貌似路由中间件那里可以不用next,用了如果 app.use(function(req,res,next){ console.log(‘middleware 2’); res.end(); }); 这里没有res.end();这句,就会两次捕获到,输出两次‘middleware 1’,两次’middleware 2‘。这又是什么问题导致的呢。 我之前的代码注册路由是没有next()。但是最后一次注册中间件的回调函数中如果有next(),就只有程序起来时,第一次访问两个普通中间件可以捕获到,第二次刷新就不行了。去掉next()就正常了。我就想请教是什么原因导致这个问题的。

@profangong 我的运行环境是node: v6.2.0,express: 4.13.1,运行结果跟你的不一样,无法复现你的问题。 根据我的和你的运行对比结果,目前怀疑是node、express版本更新导致运行结果不一致的。(可能node、express某个版本解决了某些相关Bug导致吧,我猜。)

你的node,express版本是?

@IvanYoung-GitHub 我的node 是v0.12.0, express是4.13.4,是不是node版本低了。

回到顶部