Node.js使用原生JS读取txt文件内容发送给客户端报错如何解决
问题原因
fs.readFile是异步回调API,不会直接返回读取到的文件内容,你赋值给stuffReturned的是undefined,传给res.write自然触发类型不合法的报错。- 你用的是Node.js原生的
http模块,响应对象res本身没有send方法,send是Express等上层框架封装的API,直接调用自然会提示方法不存在。 - 原有代码把
res.end()写在了if判断的外部,不等文件读取完成就已经结束了响应,就算拿到文件内容也无法写入返回给客户端。
修复方案
把响应写入逻辑放到fs.readFile的回调内部执行,读取成功后再写入响应、结束请求。修改后的server.js代码如下:
const http = require('http'); const fs = require('fs'); // 注意别忘了引入fs模块,缺失也会触发报错 const server = http.createServer((req, res) => { const { method, url } = req; res.statusCode = 200; res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "*"); res.setHeader("Access-Control-Allow-Headers", "*"); if (url === "/view-stuff" && method === "GET") { console.log("RECEIVED GET REQ"); // 第二个参数传utf-8可以直接拿到字符串格式的内容,不需要自行转码 fs.readFile("string.txt", "utf-8", (err, data) => { if (err) { res.writeHead(500, { "Content-Type": "text/plain" }); res.write("文件读取失败"); return res.end(); } res.writeHead(200, { "Content-Type": "text/plain" }); res.write(data); res.end(); // 读取完成后再结束响应 }); } else { // 其他路由场景也要结束响应,避免请求挂起 res.end(); } }); // 补充端口监听代码,缺失的话服务不会启动 server.listen(1000, () => { console.log('服务已启动,运行在1000端口'); });
同时修正client.js的语法错误(多了一个多余的闭包括号):
function getStuffToview(){ const request = new XMLHttpRequest(); // 路径里多余的斜杠可以删除,不影响运行但更规范 request.open("GET", "//localhost:1000/view-stuff", true); request.addEventListener("load", function () { try { console.log(this.responseText); } catch (e) { console.log(request.status); } }); request.send(); }
内容的提问来源于stack exchange,提问作者i am bad at coding
相关产品推荐
相关产品推荐

