我是Node的新手,所以我试图学习它。我试图在Node中加载一个简单的HTML文件,但是当我使用res.write(html)
时没有定义HTML,这给我一个错误我看到一些与我类似的例子,所以我想了解什么是这里错了。
我写了这个:
const http = require('http');
const fs = require('fs');
const hostname = '127.0.0.1';
const port = 3000;
fs.readFile('./index.html', (err, html) => {
if(err){
throw err;
}
});
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-type', 'text/html');
res.write(html);
res.end();
});
server.listen(port, hostname, () => {
console.log('Server started on port ' + port);
});
答案 0 :(得分:1)
您的问题是{I-}}变量未在您尝试使用它的范围内设置。
javascript中的几乎所有内容都是异步的,您需要处理和构建逻辑,以便从异步调用返回的值可以在程序的其他地方使用。
在你的情况下,html
是一个异步调用,它读取并返回文件 - 不幸的是,你收到html的回调有自己的范围,并且在你拥有它之后不可用完成了该回调的执行。
在此处可以找到关于如何执行此操作的规范强制性说明:How do I return the response from an asynchronous call?
在这个问题上有许多好的解决方案,例如使用闭包或承诺的结构以及其他解决方案。
直接解决方案是组合并使用回调结构 - 就像在您的示例中一样,使readFile
变量的用户在html
的回调范围内发生,就像
readFile
答案 1 :(得分:1)
正如Soren指出的那样,当您致电html
时,res.write()
未定义。异步可以非常方便,但是当你是初学者时,它有点难以理解。最适合您的是尝试处理异步任务的概念。在此之前,您的问题的解决方案是使用fs.readFile
的{strong>同步版本,fs.readFileSync
(文档here),并在{{{{}}内调用它1}}功能。
由于createServer
同步返回读取内容,您可以执行以下操作:
readFileSync
我想您尝试制作的另一个选项是在const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-type', 'text/html');
var html = fs.readFileSync('./index.html');
res.write(html);
res.end();
});
的回调中初始化html
变量。
readFile
但由于此函数是异步的,因此var html_g; //global html variable
fs.readFile('./index.html', (err, html) => {
if(err){
throw err;
} else {
html_g = html; //html_g = content_of_index_file;
});
函数可能会在createServer
初始化之前调用,从而导致出现问题。
答案 2 :(得分:0)
const http = require('http');
const fs = require('fs');
const hostname = '127.0.0.1';
const port = 3000;
fs.readFile('./index.html', (err, html) => {
if(err){
throw err;
} else if(html){
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-type', 'text/html');
res.write(html);
res.end();
});
}
});
server.listen(port, hostname, () => {
console.log('Server started on port ' + port);
});