NodeJS:用res.write()加载html

时间:2017-07-08 15:29:43

标签: javascript html node.js

我是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);
});

3 个答案:

答案 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);
});