Nodejs中req.on(end,...)会执行两遍么?
Nodejs中req.on(end,…)会执行两遍么?
var http=require(‘http’);
var querystring = require(‘querystring’);
var util = require(‘util’);
http.createServer(function(req,res){
var post=’’;
req.on('data',function(chunk){
post+=chunk;
});
req.on('end',function(){
post=querystring.parse(post);
// console.log('......'+post) 1.
res.end();
console.log(post) // 2
});
}).listen(3000);
我写个post表单请求一次,但怎么打印两次post 1处打印两个相同字符{xxx:xxx} 2处打印字符为{xxx:xxx}{}
谁能解释一下
在Node.js中,req.on('end', ...)
事件通常只会执行一次,当请求的数据完全接收完毕时触发。根据你提供的代码和描述的现象,似乎 req.on('end', ...)
被触发了两次。这通常是由于某些配置或逻辑问题导致的。让我们通过分析你的代码并提供一些可能的解决方案来解决这个问题。
首先,让我们简化并理解你提供的代码:
var http = require('http');
var querystring = require('querystring');
var util = require('util');
http.createServer(function (req, res) {
var post = '';
req.on('data', function (chunk) {
post += chunk;
});
req.on('end', function () {
post = querystring.parse(post);
console.log(post); // 这里应该只打印一次
res.end();
});
}).listen(3000);
可能的原因及解决方案
-
并发请求: 如果你在测试过程中多次提交表单请求,服务器端可能会处理多个请求,导致
req.on('end')
被多次触发。- 解决方案:确保每次测试只发送一个请求,并检查是否有其他并发请求影响。
-
中间件或代理: 如果你在使用中间件或代理(如Nginx),它们可能会重新发送请求。
- 解决方案:检查中间件或代理的配置,确保它们不会重复发送请求。
-
客户端错误: 客户端可能发送了重复的请求。
- 解决方案:确保客户端正确地发送请求,并且没有重复提交。
-
调试输出: 你提到的
console.log('......' + post)
和console.log(post)
可能会导致混淆。你可以注释掉console.log('......' + post)
并观察结果。
示例代码
以下是一个简化版本的代码,可以帮助你更好地理解:
var http = require('http');
var querystring = require('querystring');
http.createServer(function (req, res) {
var post = '';
req.on('data', function (chunk) {
post += chunk;
});
req.on('end', function () {
post = querystring.parse(post);
console.log(post); // 确保这里只打印一次
res.end();
});
}).listen(3000, function () {
console.log('Server is running on port 3000');
});
通过以上步骤,你应该能够确定为什么 req.on('end')
会被触发两次,并找到合适的解决方案。如果问题仍然存在,请进一步检查网络请求和服务器配置。
感觉是favicon捣的鬼。
http.createServer(function(req,res){
conosle.log(req.url); // 查看下请求的url
// ...
}
看看是不是会出现/favicon.ico – 如果出现的话,这是浏览器在访问首页的同时,还试图访问/favicon.ico来获取favicon。