如何修复TypeError:无法读取属性' push'未定义的

时间:2017-12-30 12:17:17

标签: javascript firebase google-cloud-functions

我试图遍历firebase中的所有用户,  并仅从特定参数创建json, 但我得到这个错误:

  

TypeError:无法读取属性' push'未定义的

我该如何解决? 谢谢

admin.database().ref("players").once('value', (snapshot, y) => {

        var jsonArray = '{}';

        snapshot.forEach(_child => {

           let cash = _child.child("player_cash");
           let uid = _child.key;
           let name = _child.child("player_name");

            var temp = JSON.parse(jsonArray);
            temp[uid].push({"id":uid,"cash":cash});
            jsonArray = JSON.stringify(temp);
        });

        response.send(jsonArray);
}

3 个答案:

答案 0 :(得分:1)

temp是一个空对象。要推送到该元素的属性,首先必须检查它是否存在(并设置为数组):

admin.database().ref("players").once('value', (snapshot, y) => {

        var jsonArray = '{}';

        snapshot.forEach(_child => {

           let cash = _child.child("player_cash");
           let uid = _child.key;
           let name = _child.child("player_name");

            var temp = JSON.parse(jsonArray);
            temp[uid] = temp[uid] || [];           // <========
            temp[uid].push({"id":uid,"cash":cash});
            jsonArray = JSON.stringify(temp);
        });

        response.send(jsonArray);
}

答案 1 :(得分:0)

我不确定你为什么解析jsonArray而不仅仅是创造它(不变性?)。
无论如何,它是一个空对象,你试着push到它里面的一个键。如果密钥尚未存在,则需要创建密钥。 也许你应该这样做:

admin.database().ref("players").once('value', (snapshot, y) => {

        var jsonArray = '{}';

        snapshot.forEach(_child => {

           let cash = _child.child("player_cash");
           let uid = _child.key;
           let name = _child.child("player_name");

            var temp = JSON.parse(jsonArray);
            temp[uid] = temp[uid] || []; // create the key if its not already there
            temp[uid].push({"id":uid,"cash":cash});
            jsonArray = JSON.stringify(temp);
        });

        response.send(jsonArray);
}

答案 2 :(得分:0)

您得到的错误是因为Object没有推送方法。

你可以保持简单

admin.database().ref("players").once('value', (snapshot, y) => {
    var jsonArray = {};

    snapshot.forEach(_child => {

       let cash = _child.child("player_cash");
       let uid = _child.key;
       let name = _child.child("player_name");

       jsonArray[uid] = {"id":uid,"cash":cash};
    });

    response.send(jsonArray);
}

结果将是:

{
  'id_1': { id: 'id_1', cash: 10 },
  'id_2': { id: 'id_2', cash: 20}
}

现在我建议您使用数组而不是对象来保存数据库的结果。

admin.database().ref("players").once('value', (snapshot, y) => {
    var jsonArray = [];

    snapshot.forEach(_child => {

       let cash = _child.child("player_cash");
       let uid = _child.key;
       let name = _child.child("player_name");

       jsonArray.push({"id":uid,"cash":cash});
    });

    response.send(jsonArray);
}

结果将是:

[
  { id: 'id_1', cash: 10 },
  { id: 'id_2', cash: 20}
]

这将更容易处理。