如果不存在,则无法在对象中创建新字段

时间:2018-03-22 14:53:13

标签: javascript json node.js

我目前有这段代码从API获取信息并使用收集的信息并将其写入JSON文件。

var xp;
fs.readFile('./xp.json', 'utf8', (err, data ) => {
    if (err) throw err;
    xp = JSON.parse(data);
});

console.log(m['id'] + " " + m['channel_id'] + " " + m['username']);

var usr = m['id'];
if (!xp[usr])
    xp[usr] = {xpp: 0};
xp[usr].xpp++;
fs.writeFile("./xp.json", JSON.stringify(xp), (err) => {
    if (err) console.error(err);
});

当我运行这个时,我收到以下错误消息: Error MSG image

所以我猜问题出在if (!xp[usr]) xp[usr] = {xpp: 0};

我对这一行的意图是:

if it's no field in the json object called usr
...
make a field looking like this:
string of usr = {
   xpp = 0
}

我已经被困在这个上几个小时了。有什么建议吗?

全功能:

    var infoUrl = "https:widget.json";
function giveXP(xyz) {
  console.log("Interval Started");
  request(xyz, function(error, response, body){
    if(!error && response.statusCode == 200){
      var parsedData = JSON.parse(body);
      var memberz = parsedData['members'];
      memberz.forEach(function(m){
        if(m['channel_id']){
          var xp;
          fs.readFile('./xp.json', 'utf8', (err, data ) => {
            if (err) throw err;
            xp = JSON.parse(data);
            console.log(m['id'] + " " + m['channel_id'] + " " + m['username']);
            var usr = m['id'];
            if (!xp[usr]) xp[usr] = {xpp: 0};
            xp[usr].xpp++;
          });
          fs.writeFile("./xp.json", JSON.stringify(xp), (err) => {
            if (err) console.error(err);
          });
        }
      });
    }
  });
} setInterval(giveXP, 3000, infoUrl);

2 个答案:

答案 0 :(得分:1)

一旦fs.read为您提供结果,您需要访问xp [usr]。作为它的异步,你必须将你的代码放在它的回调中。请看下面的代码

  var xp;
  fs.readFile('./xp.json', 'utf8', (err, data ) => {
    if (err) throw err;
    xp = JSON.parse(data);
    console.log(m['id'] + " " + m['channel_id'] + " " + m['username']);
    var usr = m['id'];
    if (!xp[usr]) xp[usr] = {xpp: 0};
    xp[usr].xpp++;
  });

  fs.writeFile("./xp.json", JSON.stringify(xp), (err) => {
    if (err) console.error(err);
  });
  // ...

答案 1 :(得分:0)

由于xp是异步的,因此当时确实不存在readFile。 所以你需要在回调中移动你的逻辑:

fs.readFile('./xp.json', 'utf8', (err, data ) => {
  if (err) throw err;
  xp = JSON.parse(data);

  if (!xp[usr]) {
    xp[usr] = {xpp: 0};
  }
  xp[usr].xpp++;
  fs.writeFile("./xp.json", JSON.stringify(xp), (err) => {
    if (err) console.error(err);
  });
});