我使用fs.readFileSync()来读取文件.html并且它正在工作。但是当我使用fs.readFile()时,我遇到了问题。你能帮我解决一下这个问题。感谢
使用fs.readFileSync();
var http = require("http");
var fs = require("fs");
http.createServer((req, res) => {
res.writeHead(200, {
"Content-type": "text/html"
});
var html = fs.readFileSync(__dirname + "/bai55.html", "utf8");
var user = "Node JS";
html = html.replace("{ user }", user);
res.end(html);
}).listen(1337, "127.0.0.1");
使用fs.readFile();它无法读取html文件,为什么?
var http = require("http");
var fs = require("fs");
http.createServer((req, res) => {
res.writeHead(200, {
"Content-type": "text/html"
});
var html = fs.readFile(__dirname + "/bai55.html", "utf8");
var user = "Node JS";
html = html.replace("{ user }", user);
res.end(html);
}).listen(1337, "127.0.0.1");
答案 0 :(得分:4)
这与nodejs的基本概念有关:异步I / O操作。这意味着当您执行I / O时,程序可以继续执行。一旦文件中的数据准备就绪,它将由回调中的代码处理。换句话说,该函数不返回值,但是它的最后一个操作执行回调传递检索的数据或错误。这是节点中的常见范例,也是处理异步代码的常用方法。 readFile的正确调用将是
fs.readFile(__dirname + "/bai55.html", function (err, html) {
if (err) throw err;
var user = "Node JS";
html = html.replace("{ user }", user);
res.end(html);
});
答案 1 :(得分:1)
由于readFile使用回调而不立即返回数据。
fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
答案 2 :(得分:0)
可以通过杠杆Promise
const fs = require('fs');
const http = require("http");
const fsReadFileHtml = (fileName) => {
return new Promise((resolve, reject) => {
fs.readFile(path.join(__dirname, fileName), 'utf8', (error, htmlString) => {
if (!error && htmlString) {
resolve(htmlString);
} else {
reject(error)
}
});
});
}
http.createServer((req, res) => {
fsReadFileHtml('bai55.html')
.then(html => {
res.writeHead(200, {
"Content-type": "text/html"
});
res.end(html.replace("{ user }", "Node JS"));
})
.catch(error => {
res.setHeader('Content-Type', 'text/plain');
res.end(`Error ${error}`);
})
}).listen(1337, "127.0.0.1");