fs.writeFyleSync записывает в файл мои данные и в начале почему-то добавляет undefined

Обработчик POST запроса обращается к методу fs.writeFyleSync, который записывает данные из запроса в файл userdata.json. Но помимо этих данных перед ними так же записывается "undefined":{} хотя этого не должно быть. Как исправить?

app.use((req, res, next) => {
    let reqBodyUser = req.body.user

    let reqJSON = {
        [req.body.name]: req.body.url
    }

    const json = fs.readFileSync('userdata.json');

    const parsedJson = JSON.parse(json);
    parsedJson[reqBodyUser] = reqJSON

    const data = JSON.stringify(parsedJson);

    console.log(reqJSON)

    fs.writeFileSync('userdata.json', data, 'utf-8', function(error){
        if(error) return console.log(error); 
        console.log("Запись файла завершена");
    });
    next();
});

На выходе я получаю такой файл userdata.json:

{
    "undefined":{},
    "test":
    {
        "test":"test"
    }
}

Примечание: при вызове метода несколько раз с разными входными данными, undefined остается один в начале, но если его стереть из файла и снова сделать запрос, строка опять появляется


Ответы (1 шт):

Автор решения: SwaD

Скорее всего undefined возникает при чтении файла.

Для выполнения JSON.parse(json) переменная json должна быть строкой.

Замените чтение файла на вот такую конструкцию

let json = fs.readFileSync('./userdata.json', 'utf-8'); 
if (!json) {
    json = '{}'
}

Файл будет считан и преобразован в строку. Если будет считан пустой файл, то будет подставлен пустой объект.

Так же, если в файле, кроме ничего, может быть не объект, то преобразование я бы вам рекомендовал обернуть в try catch

  let parsedJson = {}
  try {
    parsedJson = JSON.parse(json);
  } catch (e) {
    console.error(e)
  }

Обе проверки в коде будут выглядеть так:

  const json = fs.readFileSync('./userdata.json', 'utf-8'); 
  
  let parsedJson = {}
  try {
    parsedJson = JSON.parse(json);
  } catch (e) {
    console.error(e)
  }
→ Ссылка