Nodejs 一个简单的小DEMO,但是GET请求始终会卡住,大家帮忙看看
Nodejs 一个简单的小DEMO,但是GET请求始终会卡住,大家帮忙看看
代码如下,每次GET都会卡住不返回,请问问题出在哪? index.html文件是存在的,没有问题。
var http = require('http');
var server = http.createServer();
var querystring = require('querystring');
var fs = require('fs')
var config = {
port : 1026,
max_body : 1024 * 1024 * 20,
};
var index = function(res) {
fs.readFile('index.html',function(err, data) {
if(err)
cosneolo.error(err);
else
{
res.writeHead(200, {'Content-Type': 'text/html','Content-Length':data.length});
res.write(data);
res.end();
}
});
}
var requestFunction = function(req, res) {
if (req.url == '/') {
return index(res);
}
};
server.on('request', requestFunction);
server.listen(config.port);
8 回复
Node.js 简单小 DEMO 中 GET 请求卡住的问题
问题描述
根据你提供的代码片段,你的 Node.js 应用程序在处理 GET 请求时会出现卡住的情况。这通常意味着代码中存在某些问题导致服务器无法正常响应客户端的请求。
分析问题
首先,我们来看一下你的代码片段:
var http = require('http');
var server = http.createServer();
var querystring = require('querystring');
var fs = require('fs');
var config = {
port : 1026,
max_body : 1024 * 1024 * 20,
};
var index = function(res) {
fs.readFile('index.html', function(err, data) {
if (err)
console.error(err);
else {
res.writeHead(200, {'Content-Type': 'text/html', 'Content-Length': data.length});
res.write(data);
res.end();
}
});
}
var requestFunction = function(req, res) {
if (req.url == '/') {
return index(res);
}
};
server.on('request', requestFunction);
server.listen(config.port);
问题分析
-
回调函数未正确调用:
index
函数是一个异步函数,它需要一个回调来完成操作。但你在requestFunction
中直接调用了index(res)
,而不是将index
作为回调函数传递。
-
缺少错误处理:
- 在
fs.readFile
的回调函数中,你只处理了读取文件失败的情况,而没有处理成功读取文件后可能发生的其他错误(例如,网络连接中断)。
- 在
-
代码逻辑问题:
return index(res);
这一行会导致requestFunction
提前退出,而不会等待index
函数中的异步操作完成。
解决方案
以下是修复后的代码示例:
var http = require('http');
var fs = require('fs');
var config = {
port: 1026,
max_body: 1024 * 1024 * 20,
};
var server = http.createServer(function(req, res) {
if (req.url === '/') {
fs.readFile('index.html', function(err, data) {
if (err) {
console.error(err);
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end('Internal Server Error');
} else {
res.writeHead(200, {'Content-Type': 'text/html', 'Content-Length': data.length});
res.write(data);
res.end();
}
});
} else {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end('Not Found');
}
});
server.listen(config.port, function() {
console.log(`Server running at http://localhost:${config.port}/`);
});
关键点解释
-
创建 HTTP 服务器:
- 使用
http.createServer
创建服务器,并直接传入一个请求处理函数。这样可以避免使用server.on('request', ...)
的方式,简化代码。
- 使用
-
错误处理:
- 在
fs.readFile
的回调函数中,增加了对res.writeHead
和res.end
的错误处理,确保即使发生错误也能给客户端一个适当的响应。
- 在
-
路由处理:
- 直接在请求处理函数中处理不同的 URL 路由,简化了代码逻辑。
通过这些修改,你的 Node.js 应用应该能够正常处理 GET 请求并返回响应。希望这能解决你的问题!
目测是index.html文件太大了… 楼主是MDK???
在各个条件分支上加个console.log调试一下,肯定是走了错误流程哦
找到原因了 大家忽略吧。。
你是。。
刚才跑了一下发现是因为其他的request没有结束, 只接受了根路径 index.html里面应该还有其他请求, 所以在改成这样吧
if (req.url == ‘/’) { return index(res); }else{ res.end(); }
对 是Index里面有引用了别的Js 我又没处理 所以一直停着