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

问题分析

  1. 回调函数未正确调用

    • index 函数是一个异步函数,它需要一个回调来完成操作。但你在 requestFunction 中直接调用了 index(res),而不是将 index 作为回调函数传递。
  2. 缺少错误处理

    • fs.readFile 的回调函数中,你只处理了读取文件失败的情况,而没有处理成功读取文件后可能发生的其他错误(例如,网络连接中断)。
  3. 代码逻辑问题

    • 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}/`);
});

关键点解释

  1. 创建 HTTP 服务器

    • 使用 http.createServer 创建服务器,并直接传入一个请求处理函数。这样可以避免使用 server.on('request', ...) 的方式,简化代码。
  2. 错误处理

    • fs.readFile 的回调函数中,增加了对 res.writeHeadres.end 的错误处理,确保即使发生错误也能给客户端一个适当的响应。
  3. 路由处理

    • 直接在请求处理函数中处理不同的 URL 路由,简化了代码逻辑。

通过这些修改,你的 Node.js 应用应该能够正常处理 GET 请求并返回响应。希望这能解决你的问题!


目测是index.html文件太大了… 楼主是MDK???

在各个条件分支上加个console.log调试一下,肯定是走了错误流程哦

找到原因了 大家忽略吧。。

你是。。

刚才跑了一下发现是因为其他的request没有结束, 只接受了根路径 index.html里面应该还有其他请求, 所以在改成这样吧

if (req.url == ‘/’) { return index(res); }else{ res.end(); }

对 是Index里面有引用了别的Js 我又没处理 所以一直停着

从提供的代码来看,问题可能出现在 fs.readFile 方法的回调函数中。当读取文件时,如果发生错误(例如文件不存在),则错误处理部分可能会导致程序卡住。另外,回调函数中的错误处理逻辑中有一个拼写错误 (cosneolo.error 应该是 console.error)。

下面是修正后的代码示例:

var http = require('http');
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);
            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();
        }
    });
};

var requestFunction = function (req, res) {
    if (req.url === '/') {
        return index(res);
    }
    // 如果请求的不是根路径,则可以在这里添加其他处理逻辑
};

var server = http.createServer(requestFunction);
server.listen(config.port);

关键点解释:

  1. 错误处理:在 fs.readFile 的回调函数中,正确地处理了读取文件时可能出现的错误,并返回了一个 500 错误给客户端。
  2. 拼写错误修正:将 cosneolo.error 修改为 console.error
  3. 代码结构优化:直接在创建服务器时传入 requestFunction,简化了代码结构。

通过这些修改,应该可以解决 GET 请求卡住的问题。

回到顶部