gpt4 book ai didi

带有 fs.readFile 的 Node.js 无法通过 http 呈现文件内容

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:35 25 4
gpt4 key购买 nike

我正在学习 node.js,但在我的简单 Web 服务器代码(下面的 demo.js)中使用 fs.readFile 函数时遇到困难。如果我访问 http://localhost:8001/demo.html 我在浏览器中得不到任何数据,但是如果我访问“/”或任何其他文件名,我会看到“hello world”或符合预期的 404 页。

我已经包含了 demo.html 的内容和 Node 控制台输出,其中日志消息表明 readFile 正在读取文件正常,但我在浏览器中什么也没有,也没有看到“Got here D”日志信息。

我确定我一定遗漏了一些明显但看不到的东西。任何帮助将不胜感激!

demo.js 代码:

var http = require("http");
var url = require('url');
var fs = require('fs');

var server = http.createServer(function(request, response){
console.log('Connection');
var path = url.parse(request.url).pathname;

switch(path){
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('hello world');
break;
case '/demo.html':
fs.readFile(__dirname + path, function(error,data){
console.log("error: " + error);
console.log("data: " + data);
if (error){
console.log("Got here A");
response.writeHead(404);
response.write("oops problem loading this page - 404");
}
else{
console.log("Got here B");
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data);
}
});
break;
default:
console.log("Got here C");
response.writeHead(404);
response.write("oops this page doesn't exist - 404");
break;
}
response.end();
console.log("Got here D");
});

server.listen(8001);

演示.html:

<html>
<body>This is my demo page</body>
</html>

Node 控制台输出:

C:\code\Node>node demo.js
Connection
Got here D
error: null
data: <html>
<body>This is my demo page</body>
</html>

Got here B

最佳答案

问题出在response.end()调用的位置。

fs.readFile 是一个异步函数;就像 Node 中与I/O 相关的所有函数一样。这意味着文件的读取是在后台进程中完成的,当数据可用时,您定义的回调函数将被调用并返回结果。

Node 在 fs.readFile 之后继续执行您的代码,这导致 response.end() 在您的回调 函数构建之前被调用响应

要解决此问题,您必须将 response.end() 调用移至如下情况:

var http = require("http");
var url = require('url');
var fs = require('fs');

var server = http.createServer(function(request, response){
console.log('Connection');
var path = url.parse(request.url).pathname;

switch(path){
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('hello world');
response.end();
break;
case '/demo.html':
fs.readFile(__dirname + path, function(error,data){
console.log("error: " + error);
console.log("data: " + data);
if (error){
response.writeHead(404);
response.write("oops problem loading this page - 404");
}
else{
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data);
}

response.end();
});
break;
default:
response.writeHead(404);
response.write("oops this page doesn't exist - 404");
response.end();
break;
}
});

关于带有 fs.readFile 的 Node.js 无法通过 http 呈现文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23680121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com