NodeJS:使用promises时填充\ r \ n的数组和/或JSON

时间:2017-08-04 00:39:19

标签: json node.js promise

当我被问到时,我的服务器应该将一些数据(存储为json)发回给我。为了避免阻塞通信,我设置了2个promises:一个用于读取文件:

function readingfile(survey) {
  return new Promise(
    function (data_read, err) {
    fs.stat(`./data/${survey}.json`, function (err, stat) {
      if (err == null) {
        fs.readFile(`./data/${survey}.json`, 'utf8', (err, data) => {
          data_read((data))
        })
      } else
        console.error(`./data/${survey}.json doesnt exist`)
    })
  })
}

和一个读取用户的所有文件:

function readingusersurveys(user) {
  let questionnaires = [];
  let count = 0;
  return new Promise(
    function (data_read, err) {
      user.surveys.forEach((survey) => {
        readingfile(survey).then(function (all_surveys) {
        count++;
        //console.log((all_surveys)) //ok here
         questionnaires.push((all_surveys))
         if (count == user.surveys.length) {
           console.log((questionnaires)) //not ok here (wtf)
           data_read((questionnaires))
         }
       })
     })
  })
}

以及发送数据的代码段:

 [...]
 readingusersurveys(req.user).then(function (all_surveys) {
    //console.log(all_surveys)
    questionnaires.push((all_surveys))
    console.log(questionnaires)
    if (questionnaires != null) {
      res.status(200).json({
        questionnaires
      });
    } else {
      res.status(500).json({});
   }
 })

但是当readusersurveys()返回读取的数据时,它会被大量的\ r \ n填充,使文件不可读。如果我尝试在某处放置JSON.parse,我要么:输入无限循环或数据变得不可读/未定义(例如:{“asset”:[“value”]}变为{“asset”:[Object]})

我试图在任何地方放置一个JSON.parse来改变竞争但没有运气。知道怎么摆脱\ r \ n和/或我的代码中缺少什么? :/

1 个答案:

答案 0 :(得分:1)

经过多次尝试后,我发现问题不在于JSON.parse,而是questionnaire.push。它没有做我正在做的事情(一起添加2个json数组)。

在此处添加JSON.parse

function readingusersurveys(user) {
  let questionnaires = [];
  let count = 0;
  return new Promise(
    function (data_read, err) {
      user.surveys.forEach((survey) => {
        readingfile(survey).then(function (all_surveys) {
        count++;
         questionnaires.push(JSON.parse(all_surveys)) //  <-- HERE
         if (count == user.surveys.length) {
           data_read((questionnaires)) //<-- array of JSON at this point
         }
       })
     })
  })
}

 [...]
 readingusersurveys(req.user).then(function (all_surveys) {
  questionnaires = (all_surveys) //<-- pushing an array of JSON into another array was what created problems
  if (questionnaires != null) {
    res.status(200).json({
      questionnaires
    });
  } else {
    res.status(500).json({});
  }
})

如果我想在那里做一个循环并添加更多调查,我需要使用concat()代替

if (questionnaires[0] == null)
   questionnaires = all_surveys
else
   questionnaires = questionnaires.concat(all_surveys)