【问题标题】:readFile async await in nodejsnodejs中的readFile异步等待
【发布时间】:2021-04-16 04:10:54
【问题描述】:
import http from "http"
import fs from "fs"

function readDemo(path){
    return new Promise((resolve,reject)=>{
        fs.readFile(path,(err,data)=>{
            if(err)
                reject(err);
            else
                resolve(data);
        })
    })
}

const server = http.createServer((req,res)=>{
    if(req.url === `/`){
        res.writeHead(200,{"Content-type":"text/html"});
        readDemo(`./todo.html`)//
            .then(data => res.write(data))
            .catch(console.log);
        res.end();
    }
})

server.listen(5000);

我正在尝试通过请求 localhost:5000 在 Nodejs 中运行我自己的服务器来加载 todo.html
似乎 fs.readFile 需要很长时间来加载 css 和 javascript 部分,所以我做出了 Promise 声明,让 res.write 等待 fs.readFile 完成加载 todo.html 包含链接的 css 和 javascript。

但是代码集错误提示

events.js:292
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at writeAfterEnd (_http_outgoing.js:668:15)
    at write_ (_http_outgoing.js:680:5)
    at ServerResponse.write (_http_outgoing.js:661:15)
    at file:///C:/Users/KUSW-14/Downloads/web_study-main/web_study-main/to_do_list/main.js:19:31   
Emitted 'error' event on ServerResponse instance at:
    at writeAfterEndNT (_http_outgoing.js:727:7)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}  

谁能帮我看看我的代码有什么问题?

【问题讨论】:

标签: node.js promise request fs


【解决方案1】:

readFile() 是非阻塞的,因此您在调用res.write() 之前调用res.end()。我建议像这样使用await

const server = http.createServer(async (req, res) => {
    if(req.url === `/`){
        try {
            const data = await readDemo(`./todo.html`);
            res.writeHead(200,{"Content-type":"text/html"});
            res.write(data)
            res.end();
        } catch(e) {
            console.log(e);
            res.writeHead(500);
            res.end();
        }
    } else {
        res.writeHead(404);
        res.end();
    }
});

如果没有await,则需要将res.end() 移动到.then() 内部:

const server = http.createServer((req,res)=>{
    if(req.url === `/`){
        readDemo(`./todo.html`).then(data => {
            res.writeHead(200,{"Content-type":"text/html"});
            res.write(data);
            res.end();
        }).catch(err => {
            console.log(err);
            res.writeHead(500);
            res.end();
        });
    } else {
        res.writeHead(404);
        res.end();
    }
});

仅供参考,在 node.js 的现代版本中,fs.promises.readFile() 已经是 Promise 版本,因此您不必自己制作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2020-01-31
    • 2019-07-20
    • 2018-10-12
    • 2018-02-08
    • 2019-06-30
    • 2019-08-08
    相关资源
    最近更新 更多