in循环中的node mongoose不起作用

时间:2015-07-07 04:26:46

标签: javascript node.js mongoose

我有以下代码:

app.get('/api/getSubRooms/:id', function(req, res, next) {
var rooms = [];
Room.findById(req.params.id, function(err, room) {
    if (err) throw  err;
    var rootRoom = room;
    console.log("Subrooms: " + rootRoom.subrooms);
    for (var subroom in rootRoom.subrooms) {
        Room.findById(subroom, function(err, room) {
            if (err) throw  err;
            rooms.push(room);
            if (rooms.length === rootRoom.subrooms.length) res.send(rooms);
        });
    }
});
});

现在数组rootRoom.subrooms包含来自MongoDB的ObjectID,但是for-in循环给我0作为第一个成员,尽管这个成员显然不存在于数组中,如console.log所示。当我使用传统的for循环时:

for (var i=0; i<rootRoom.subrooms.length; ++i) {
        Room.findById(rootRoom.subrooms[i], function(err, room) {
            if (err) throw  err;
            rooms.push(room);
            if (rooms.length === rootRoom.subrooms.length) res.send(rooms);
        });

一切都按预期工作。任何人都知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

来自MDN docs

  

数组索引只是具有整数名称的可枚举属性   否则与一般对象属性相同。没有   保证for ... in将返回任何特定的索引   order,它将返回所有可枚举的属性,包括那些   使用非整数名称和继承的名称。

这个0成员可能来自原型链上的不同可枚举属性。