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}{}

谁能解释一下


3 回复

在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);

可能的原因及解决方案

  1. 并发请求: 如果你在测试过程中多次提交表单请求,服务器端可能会处理多个请求,导致 req.on('end') 被多次触发。

    • 解决方案:确保每次测试只发送一个请求,并检查是否有其他并发请求影响。
  2. 中间件或代理: 如果你在使用中间件或代理(如Nginx),它们可能会重新发送请求。

    • 解决方案:检查中间件或代理的配置,确保它们不会重复发送请求。
  3. 客户端错误: 客户端可能发送了重复的请求。

    • 解决方案:确保客户端正确地发送请求,并且没有重复提交。
  4. 调试输出: 你提到的 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。

在Node.js中,req.on('end', ...) 事件通常只会执行一次,表示请求体已经完全读取完毕。然而,在你的代码中,req.on('end', ...) 执行两次的原因可能是由于请求被重用了或者中间件的某些行为导致的。

为了帮助你更好地理解问题,我们可以通过简化代码并添加一些调试信息来进一步分析。以下是修改后的代码:

var http = require('http');
var querystring = require('querystring');

http.createServer(function (req, res) {
    var post = '';

    req.on('data', function (chunk) {
        console.log('Received chunk of data:', chunk.length);
        post += chunk;
    });

    req.on('end', function () {
        console.log('Request body fully received.');
        post = querystring.parse(post);
        console.log('Parsed POST data:', post);
        res.end(JSON.stringify(post));
    });
}).listen(3000);

console.log('Server listening on port 3000');

解释

  1. 数据分片处理:在 req.on('data', ...) 中,每次接收到数据块时都会打印出数据块的长度。
  2. 请求结束:在 req.on('end', ...) 中,打印一条消息表示请求体已完全接收,并解析 post 变量。
  3. 响应:将解析后的 post 数据以 JSON 格式返回给客户端。

通过这种日志输出,你可以更容易地看到请求处理过程中发生了什么。如果 req.on('end', ...) 仍然多次执行,那么可能是由于请求被重复处理或请求本身有问题。确保你的客户端只发送一次POST请求,并且没有其他中间件干扰。

如果你确定客户端只发送了一次请求,并且请求处理过程中没有其他中间件影响,那么请检查是否有其他逻辑错误或配置问题。

回到顶部