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);
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
被调用了两次,可能的原因包括但不限于:
- 多次启动服务器:你可能在代码的其他位置或通过命令行多次启动了同一个脚本。
- 多端口监听:你可能无意中配置了多个端口监听,导致同一个请求被多次处理。
- 重复的
createServer
调用:你可能在代码中多次调用了http.createServer
并启用了多个服务器实例。
解决方案
确保只启动一次服务器。检查你的代码是否有多余的 server.listen
或 http.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入门》书里面有介绍,楼主可以参考一下
从你的代码来看,问题可能出在 onRequest
函数的定义方式上。在你的代码中,onRequest
函数直接被赋值给 http.createServer
的回调函数,但没有使用箭头函数或者正确绑定 this
上下文。
通常情况下,如果 onRequest
函数被调用了两次,可能是因为它被注册了两次。然而,在你提供的代码中,似乎没有明显的逻辑错误导致 onRequest
被调用两次。为了确保问题得到解决,可以尝试以下几种方法:
- 检查是否有重复的
createServer
调用:确认是否在代码的其他地方或外部文件中调用了http.createServer()
方法两次。 - 使用箭头函数:将
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
函数两次。