обновленное значение json не записывается в файл в NodeJS

#javascript #node.js

Вопрос:

Я пытаюсь прочитать существующее значение JSON и обновить его новым значением в своем тестовом классе, но я не получаю ожидаемого результата — он не записывается как объект JSON и обновляется пустым значением в строковом формате. Пожалуйста, найдите код ниже:

 beforeAll(async () => {
    const fileName = '../test.json'
    let fileContent = await readFile(fileName);
    fileContent.productID = 'prod12212';
    let updatedContent = await testWriteFile(fileName, fileContent);
    console.log(updatedContent)

});



const readFile = async (filePath) => {
  try {
    const result = await fs.promises.readFile(filePath, 'utf8')
    return result
  }
  catch (err) {
    console.log(err)
  }
}


const testWriteFile = async (filePath, fileContent) => {
  try {
    console.log('filoe content value', fileContent)
    const result = await fs.promises.writeFile(filePath, JSON.stringify(fileContent))
    return result
  }
  catch (err) {
    console.log(err)
  }
}
 

тест.json

 {
    "productID": ""
}
 

Ожидаемый результат:

 {
    "productID": "prod12212"
}
 

Но ниже вывода, который я получаю, какую ошибку я здесь совершаю:

 "{n    "productID": ""n}"
 

Комментарии:

1. Вы просто забыли проанализировать JSON, когда читали файл.

2. Что здесь делает функция beforeAll (….)?

Ответ №1:

Во-первых, одна из ваших проблем заключается в том, что вы объявляете выражение функции (const fn = () => { …. } ) и использовать их до того, как они будут объявлены. Выражения функций не поднимаются, что означает, что вы не можете использовать их до того, как они будут объявлены. Но если вы объявите функцию ( функция fn() { … }) вы можете использовать его до его объявления.

Во-вторых, вы читаете содержимое файла в функции «До всего», но не анализируете его. Это просто обычная строка, если вы ее не разберете.

В конце концов, файл fs.promise.WriteFile (….) возвращает обещание<недействительно>! Он не возвращает обновленное содержимое файла.

Вот модифицированный код, который сработал для меня.

 const fs = require("fs");

const readFile = async (filePath) => {
  try {
    return await fs.promises.readFile(filePath, "utf8");
  } catch (err) {
    console.error(err);
  }
};

const writeFile = async (filePath, fileContent) => {
  try {
    fileContent = JSON.stringify(fileContent);
    await fs.promises.writeFile(filePath, fileContent);
  } catch (err) {
    console.error(err);
  }
};

const updateFile = async () => {
  const fileName = "./test.json";
  let fileContent = await readFile(fileName);

  // Parse the file content as json and then update it
  try {
    fileContent = JSON.parse(fileContent);
  } catch (err) {
    console.log(err);
  }

  // here fileContent is an object
  fileContent.productID = "prod12212";

  writeFile(fileName, fileContent);
};

updateFile();