fs.readFileSync无法识别同目录文件报ENOENT错误如何解决
问题现象
使用Node.js搭建HTTP服务时,即使目标HTML文件node.html与执行脚本存放在同一文件夹下,调用fs.readFileSync方法读取该文件时仍无法识别文件,运行后抛出如下错误:
Error: ENOENT: no such file or directory, open 'node.html'
复现代码
const http = require('http'); const PORT = 3000; const fs = require('fs') const server = http.createServer((req, res) => { if (req.url === '/') { res.writeHead(200, {'content-type': 'text/html'}); const homePageHTML = fs.readFileSync('node.html'); console.log(homePageHTML) res.end() } else { res.writeHead(404, {'content-type': 'text/html'}); res.write('<h1>Sorry, you were misled!</h1>') res.end() } }) server.listen(PORT);
故障原因
fs模块传入相对路径时,路径解析的基准是执行node命令时终端所在的工作目录,而非当前执行脚本文件所在的目录。如果启动脚本时没有先进入脚本所在的文件夹,相对路径就会指向错误的位置,导致找不到目标文件。
修复方法
- 推荐方案:使用
__dirname(CommonJS模块内置变量,代表当前脚本所在目录的绝对路径)拼接目标文件路径,完全不受启动命令所在目录的影响:
将读取文件的代码行替换为:
额外提示:当前代码读取到HTML内容后没有写入响应,可将对应位置的const homePageHTML = fs.readFileSync(`${__dirname}/node.html`);res.end()修改为res.end(homePageHTML),否则访问首页会返回空白内容。 - 临时方案:启动脚本前先通过
cd命令进入脚本文件所在的目录,再执行node启动命令,该方式依赖启动路径,容易因操作失误复现问题,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者nicht verfügbar
相关产品推荐
相关产品推荐

