Nodejs 为什么每次运行都会调用两次onRequest

Nodejs 为什么每次运行都会调用两次onRequest

    enter code herevar http = require(‘http’);
var global_count = 1;
var onRequest =function(res,resp){
console.log(‘into server’);
resp.write(‘您是第’+global_count+‘次访客’);
resp.end();
global_count++; console.log(global_count); } var server=http.createServer(onRequest); server.listen(9090);


6 回复

Node.js 为什么每次运行都会调用两次 onRequest

在 Node.js 中,http.createServer 方法用于创建一个 HTTP 服务器。该方法接受一个回调函数作为参数,该回调函数会在每次接收到 HTTP 请求时被调用。如果你发现每次运行你的 Node.js 应用程序时,onRequest 回调函数被调用了两次,那么可能是因为你在某些地方无意中启动了两次服务器。

示例代码分析

让我们来看一下你提供的代码:

var http = require('http');
var global_count = 1;

var onRequest = function(req, res) {
    console.log('into server');
    res.write('您是第' + global_count + '次访客');
    res.end();
    global_count++;
    console.log(global_count);
};

var server = http.createServer(onRequest);
server.listen(9090);

在这个例子中,我们定义了一个 HTTP 服务器,并且将 onRequest 函数设置为请求处理函数。每当有客户端请求到达服务器时,onRequest 将会被调用一次。

可能的原因

如果你发现 onRequest 被调用了两次,可能的原因包括但不限于:

  1. 多次启动服务器:你可能在代码的其他位置或通过命令行多次启动了同一个脚本。
  2. 多端口监听:你可能无意中配置了多个端口监听,导致同一个请求被多次处理。
  3. 重复的 createServer 调用:你可能在代码中多次调用了 http.createServer 并启用了多个服务器实例。

解决方案

确保只启动一次服务器。检查你的代码是否有多余的 server.listenhttp.createServer 调用。你可以使用以下方式来确保只启动一次服务器:

if (!server.listening) {
    server.listen(9090);
}

或者简单地检查你的代码逻辑,确保没有重复的启动操作。

示例代码改进

为了确保只启动一次服务器,可以这样修改代码:

var http = require('http');
var global_count = 1;

var onRequest = function(req, res) {
    console.log('into server');
    res.write('您是第' + global_count + '次访客');
    res.end();
    global_count++;
    console.log(global_count);
};

var server = http.createServer(onRequest);

// 确保只启动一次服务器
if (!server.listening) {
    server.listen(9090, () => {
        console.log('Server is listening on port 9090');
    });
}

通过这种方式,你可以避免重复启动服务器的情况,从而解决 onRequest 被调用两次的问题。


var http = require('http');
var server = http.createServer(function (res, resp) {
    console.log(res.url);
    resp.end();
});
server.listen(9090);

2次是因为浏览器会默认请求一次favicon.ico

E:\nginx-1.2.3\html>node test.js
/ 1111111111
/favicon.ico 1111111111

浏览器会自带一个HTTP请求favicon.ico!

这个在《Node入门》书里面有介绍,楼主可以参考一下

tks这个问题已解决。 加入路由 控制 和写缓存就不会出现第二次了、

从你的代码来看,问题可能出在 onRequest 函数的定义方式上。在你的代码中,onRequest 函数直接被赋值给 http.createServer 的回调函数,但没有使用箭头函数或者正确绑定 this 上下文。

通常情况下,如果 onRequest 函数被调用了两次,可能是因为它被注册了两次。然而,在你提供的代码中,似乎没有明显的逻辑错误导致 onRequest 被调用两次。为了确保问题得到解决,可以尝试以下几种方法:

  1. 检查是否有重复的 createServer 调用:确认是否在代码的其他地方或外部文件中调用了 http.createServer() 方法两次。
  2. 使用箭头函数:将 onRequest 改为箭头函数,确保上下文正确传递。

以下是修改后的代码示例:

var http = require('http');

var global_count = 1;

// 使用箭头函数
const onRequest = (req, res) => {
    console.log('into server');
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.write('您是第' + global_count + '次访客');
    res.end();
    global_count++;
    console.log(global_count);
}

var server = http.createServer(onRequest);
server.listen(9090, () => {
    console.log('Server is running on port 9090');
});

解释:

  • 箭头函数:使用箭头函数可以避免 this 上下文问题,并且更简洁。
  • 响应头设置:使用 res.writeHead 设置响应头,以确保正确的 HTTP 响应格式。
  • 监听端口:添加了一个回调函数来输出服务器启动信息。

如果你仍然遇到问题,请确保没有其他地方调用 http.createServer 或者 onRequest 函数两次。

回到顶部