Node.js代码出现Write after end错误,求排查解决方法
解决Node.js中"Write after end"错误的问题
我来帮你搞定这个问题——这个错误的核心原因完全是异步操作的执行顺序搞反了!
你代码里的fs.open是异步方法,它不会卡住后续代码的执行。也就是说,当你调用fs.open之后,JavaScript会直接跳到后面执行res.end(),把HTTP响应给提前结束了。等fs.open的回调函数触发的时候,响应已经被关闭,这时候再调用res.write(fd)自然就会抛出"Write after end"的错误。
解决办法:调整代码执行顺序
把res.end()移到fs.open的回调函数内部,确保只有在完成响应内容的写入之后,才结束响应。另外还要注意,fd是数字类型的文件描述符,直接res.write(fd)会把它转成字符串输出,如果这不是你想要的,后面我也会给出读取文件内容的优化方案。
修改后的代码如下:
import http = require('http'); const fs = require("fs"); var port = process.env.port || 8888 var i = 1; http.createServer(function (req, res) { res.writeHead(200, { "Content-Type": "text/html" }); console.log(i++ + "\n" + req.connection.remoteAddress); fs.open('1.html', "a+", (error, fd) => { // 先处理可能出现的文件操作错误,避免服务崩溃 if (error) { res.write('Error opening file: ' + error.message); res.end(); return; } res.write(fd.toString()); // 将文件描述符转为字符串输出 res.end(); // 在这里结束响应,确保写入操作完成后再关闭 }); }).listen(port);
额外优化:如果需要返回文件内容
如果你的实际需求是读取1.html的内容并返回给客户端,用fs.readFile会更简洁,不需要手动处理文件描述符,示例代码:
import http = require('http'); const fs = require("fs"); var port = process.env.port || 8888 var i = 1; http.createServer(function (req, res) { res.writeHead(200, { "Content-Type": "text/html" }); console.log(i++ + "\n" + req.connection.remoteAddress); fs.readFile('1.html', 'utf8', (error, data) => { if (error) { res.write('Error reading file: ' + error.message); res.end(); return; } res.write(data); res.end(); }); }).listen(port);
内容的提问来源于stack exchange,提问作者Favorite Right Arm
相关产品推荐
相关产品推荐

