【问题标题】:Send html file after it is created with NODE and Express使用 NODE 和 Express 创建后发送 html 文件
【发布时间】:2019-11-26 23:04:07
【问题描述】:

所以我尝试创建一个 HTML 文件,然后在用户发出 GET 请求时将其发送(作为更大项目的第一步)作为响应。根据用户提供的请求参数,HTML 文件中应该有相应的内容。

首先,我尝试了一个简单的示例,我使用了async 函数,因为必须在创建输出文件后做出响应。

问题是:文件中包含正确的信息(在本例中只是元素列表),但不幸的是,当我运行节点应用程序并发出请求时,正文中什么也没有。我在await 之后调用了res.sendFile 以确保文件已成功写入。我错过了什么吗?我对 ASYNC/AWAIT 过程的理解有误吗?

下面是我的代码的 sn-p。


function writeFile(N, name) {  //function that writes the list of elements in a html file
    var stream = fs.createWriteStream(FILEPATH, 'utf-8'); //filepath being the actual output file
    stream.once("open", () => {
        for (let i = 0; i < N; i++) {
            stream.write(`<li>idx=${i} and nm=${name}</li>\n`);
        }
        stream.end();
    });
}

app.get('/list/:name/number/:id', (req, res) => { //the params 
    var fun = async() => {
        try {
            await writeFile(req.params.id, req.params.name); //wait for writing into file
            res.sendFile(FILEPATH); 
        } catch (err) {
            console.log(err);
            res.send(err);
        }
    }
    fun();
});

提前谢谢你:)

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    函数 writeFile 必须返回 Promise。

    function writeFile(N, name) {
      return new Promise(function(resolve, reject) {  
        var stream = fs.createWriteStream(FILEPATH, 'utf-8'); //filepath being the actual output file
        stream.once("close", resolve);
        stream.once("open", () => {
            for (let i = 0; i < N; i++) {
                stream.write(`<li>idx=${i} and nm=${name}</li>\n`);
            }
            stream.end();      
        });
    }
    }
    

    【讨论】:

    • 我试过了,现在我在正文中得到了一些东西,但只有列表的第一个元素。如果我多次发送请求,有时它不会返回任何正文。我检查了html文件没问题。
    • 必须实际使用stream.once("close",()=&gt;resolve());,因为“once”需要一个回调函数,现在它可以工作了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多