Node.js读取文件返回空响应、write after end及await报错如何解决?
错误根因
- 第一个
ERR_STREAM_WRITE_AFTER_END报错:fs.promises.readFile是异步方法,不会阻塞主线程执行,你在异步逻辑外直接调用res.end(),会在文件读写、响应写入操作完成前就提前关闭响应流,后续再调用res.write就会触发该错误。 - 第二个
await 只能在 async 函数中使用报错:await关键字必须在被async关键字修饰的函数内使用,你直接在http.createServer的普通箭头函数回调中使用await不符合语法规则。另外你用await接收异步结果后,再继续用.then/.catch链式调用的写法也是混乱的,await拿到的是Promise的resolve结果,不是Promise对象本身。
解决方案
直接给createServer的回调函数加上async修饰,用try catch处理文件读取的异常,所有异步逻辑执行完成后再调用res.end()即可。
完整修复代码
var http = require("http"); var fs = require("fs").promises; var server = http.createServer(async (req, res) => { try { // 读取访问次数文件 let visitCount = await fs.readFile('AcessedTimes.dat', 'utf-8'); visitCount = parseInt(visitCount) || 0; // 返回响应 res.write(`This website was accessed ${visitCount} times`); // 写入新的访问次数 await fs.writeFile('AcessedTimes.dat', (visitCount + 1).toString()); } catch (err) { // 文件不存在的情况,初始化访问次数 if (err.code === 'ENOENT') { res.write("This is the first time this website is accessed!"); await fs.writeFile('AcessedTimes.dat', '1'); } else { // 其他错误打印日志 console.log(err); res.statusCode = 500; res.write('Server Error'); } } // 所有逻辑执行完成后再关闭响应 res.end(); }) server.listen(3000, () => { console.log('服务已启动,监听端口3000'); });
内容的提问来源于stack exchange,提问作者DaviArcherBR
相关产品推荐
相关产品推荐

