Node.js处理POST请求写入JSON文件报ENOENT错误该如何解决?
问题原因
1. 相对路径解析错误
Node.js 中 fs 模块的相对路径是相对于执行node命令的工作目录(也就是你启动服务时的终端所在目录,通常是项目根目录),而不是相对于写路径的JS文件所在目录。
你在productModels.js中写的../data/products.json,当你在项目根目录启动服务时,会被解析为根目录的上级目录下的data/products.json,自然找不到对应文件。
2. 异步写入未等待
writeDataToFile是异步方法,你调用时没有加await,可能程序还没完成文件写入就已经返回结果,甚至写入错误也没有被捕获。
3. 冗余代码逻辑错误
你在find方法中写的element => element.id = id是赋值操作,不是相等判断,虽然这段逻辑是冗余的(你已经构造好了新的product对象,不需要再查数组),但存在语法错误。
4. 文件名/文件存在性问题
你给出的目录结构中data目录下只有products.js,你要写入的是products.json,需要确认这个文件是否存在,初始内容建议设为[]空数组。
解决步骤
步骤1:替换为绝对路径
直接基于项目根目录的工作路径拼接绝对路径,修改productModels.js中调用writeDataToFile的路径:
// 先导入path模块 import path from 'path' // 调用写入方法时使用绝对路径 await writeDataToFile(path.resolve(process.cwd(), './data/products.json'), products)
步骤2:等待异步写入完成
修改create方法为异步方法,等待文件写入完成再返回结果:
export const create = async (product) => { const id = uuid() const newProduct = {...product, id} products.push(newProduct) // 等待文件写入完成 await writeDataToFile(path.resolve(process.cwd(), './data/products.json'), products) // 不需要冗余的find查询,直接返回已构造的新对象即可 return new Promise((resolve) => { setTimeout(() => { resolve(newProduct) }, 1000) }) }
步骤3:确认文件存在
检查data目录下是否存在products.json文件,如果不存在手动创建,初始内容填[]即可。
内容的提问来源于stack exchange,提问作者Nishant Kumar
相关产品推荐
相关产品推荐

