You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:07