【问题标题】:write a json file in nodejs在nodejs中写一个json文件
【发布时间】:2021-12-12 17:13:07
【问题描述】:

我有现有的 products.json 数据,它由一组数据组成,我想在发布请求上推送一个新的 json 对象。虽然 json 对象数组得到更新,但是当我打开 product.json 文件时,我看不到该文件中新添加的数据。我收到这样的错误

[Error: ENOENT: no such file or directory, open '../data/products.json'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '../data/products.json'
}

文件夹结构

 controllers
     productController.js
models
     productModels.js 
data
   products.js
node_modules
package.json
package-lock.json
server.js

产品控制器文件

export const createProduct = async (req, res) => {
    try{
        const product = {
            userId: 'req.userId',
            id: 'req.id',
            title: 'req.title',
            body: 'req.body'
        }
        const newProduct = await create(product)
        res.writeHead(201, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify(newProduct))
    }catch(err){
        console.log(err)
    }
}

产品模型文件

export const create = (product) => {
    const id = uuid()
    const newProduct = {...product, id}
    products.push(newProduct)

    writeDataToFile('../data/products.json', products)

    const promise = new Promise((resolve, reject) => {
        const newProduct = products.find(element => element.id = id)
        setTimeout(() => {
            resolve(newProduct)
        }, 1000)
    })
    return promise
}

utils.js 文件

import { writeFile } from 'fs/promises';

export const writeDataToFile = async (filename, content) => {
    try {
        console.log(filename)
        console.log(process.cwd())
        await writeFile(filename, JSON.stringify(content));      
      } catch (err) {
        console.error(err);
      }
}

【问题讨论】:

  • `虽然json对象数组得到更新但是当我打开product.json文件`,这是什么意思?你是先从文件中读取数据吗?
  • 你检查过这个吗? stackoverflow.com/questions/43260643/… 如果它对您不起作用,那么我们会为您的问题找到下一个解决方案。
  • @DarshanRaval SO 根据问题中提供的场景提出不同的问题。
  • @ApoorvaChikara 对不起。
  • @DarshanRaval 别抱歉,没关系。

标签: node.js fs


【解决方案1】:

似乎路径不正确,这就是它没有更新文件的原因。


import { writeFile } from 'fs/promises';
import * as path from 'path';

import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

export const writeDataToFile = async (filename, content) => {
    try {
        console.log(filename)
        console.log(process.cwd());
        console.log(path.join(__dirname, filename)) // check if the path is correct
        await writeFile(path.join(__dirname, filename), JSON.stringify(content));      
     return 'File Updated';
      } catch (err) {
        console.error(err);
      }
}

您可能需要等待文件操作执行:


export const create = (product) => {
    const id = uuid()
    const newProduct = {...product, id}
    products.push(newProduct)

    await writeDataToFile('../data/products.json', products)

    const promise = new Promise((resolve, reject) => {
        const newProduct = products.find(element => element.id = id)
        setTimeout(() => {
            resolve(newProduct)
        }, 1000)
    })
    return promise
}

【讨论】:

  • 它不工作,我收到错误,“ReferenceError: __dirname is not defined”。我在导入路径模块时没有犯任何错误。
  • 是的,您使用的是 es 模块系统,它不能直接使用它。我已经添加了代码检查。
  • 我可以成功写入文件,product.json 文件已更新,但现在当我创建请求时服务器发送响应“错误:服务器未返回任何内容(无标题,无数据)”跨度>
  • 太好了,我相信您可以为此提出一个新问题。随着这个问题(最初是您提出的问题)得到解决,应标记答案并投票以供将来参考。
  • 不客气?。
猜你喜欢
  • 2017-10-05
  • 2012-11-13
  • 2014-11-08
  • 2014-10-07
  • 2014-04-01
  • 2020-01-11
  • 2018-05-10
  • 1970-01-01
  • 2021-08-01
相关资源
最近更新 更多