【问题标题】:nodejs - http.createServer seems to call twicenodejs - http.createServer 似乎调用了两次
【发布时间】:2021-02-13 10:37:38
【问题描述】:

如果我在节点中编写以下程序:

  http.createServer(function (req, res) {

    if( req.method == 'GET' ) {
      var body = ''; req.on('data', function(data) { body += data });
      req.on('end',  function() {
        console.log('request ended')
      });
    }

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('142\n');
  }).listen(3500);

然后用http://xxx.xx.xxx.xx:35010 访问服务器,我在控制台上看到request ended 两次——我不确定为什么单个HTTP 请求会导致它执行两次。

【问题讨论】:

标签: node.js


【解决方案1】:

这很正常 - 您的浏览器会拨打多个电话。

例如,大多数浏览器都会调用 /favicon.ico

尝试记录网址:

console.log(req.url);

你会看到被调用的内容。

【讨论】:

  • 这可能很愚蠢,但 response.write("Hi") 没有显示两次的确切原因是什么?
  • 每个查询获取一次。 favicon 请求获取是和丢弃它不是图标内容,并且 html 页面的常规 http 请求显示它。
  • 我试图在我的 createServer 代码中进行增量并被调用两次,结果完全混乱。
  • 我有同样的问题,但我不明白用 favicon 链接的答案:在第二次调用中,我在“req.url”中找到与第一次调用相同的路径。一旦我对 Node 服务器进行了调试,这个 bug 就变得很烦人,因为我在 2 个并行执行相同操作的线程之间进行处理。
【解决方案2】:

通常,favicon.ico 由浏览器获取。所以,这两个电话。

此问题的解决方案是检查请求 URL 是否获取 favicon.ico

http.createServer(function (req, res) {
    if (req.url != '/favicon.ico') {
        // do your stuffs
    }
}).listen(3500);

【讨论】:

    【解决方案3】:

    另一件需要注意的事情是现代浏览器可能会预取或预加载页面。 Chrome 有时甚至会在您在地址栏中输入之前执行此操作!

    可以在隐私和安全下禁用,但这会影响所有浏览。

    您还可以检查 header Purpose: prefetch 并返回错误。 (我不确定官方的回应应该是什么。)

    这种情况不太可能经常发生,但如果您正在测试 API,那么突然发出意外请求可能会很烦人,更糟的是很危险。

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 2014-01-08
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      • 2013-02-04
      • 2021-01-26
      相关资源
      最近更新 更多