首页 > 解决方案 > 数组对象不可迭代

问题描述

我在 Mongoose 和 NodeJS 中有这个模型:

const VisitorSchema = new Schema({
  visits: [{date: Date, path: String, details: String}],
  // ...
});

而这段代码:

// Get all visitors.
VisitorSchema.statics.getAllVisitors = function() {
  try {
    // Return all users.
    return Visitor.find()
      .sort({created: -1})
      .exec();
  } catch (err) {
    console.log(err);
  }
};

// Check and print new users.
VisitorSchema.statics.checkPaths = async function() {
  console.log("Checking paths...");
  let visitors = await this.getAllVisitors();
  for (let visitor of visitors) {
    try {
      for (let v of visitors.visits) {
        // ...
      }
    } catch (e) {
      console.log(e);
      console.log(Object.prototype.toString.call(visitor.visits));
      throw(e);
    }
  }
};

运行此函数意外抛出:

Checking paths...
TypeError: visitors.visits is not iterable
    at Function.VisitorSchema.statics.checkPaths
[object Array]
5efba3a0a97a823909802df5
(node:23663) UnhandledPromiseRejectionWarning: TypeError: visitors.visits is not iterable
    at Function.VisitorSchema.statics.checkPaths 
    at processTicksAndRejections
    ....

我还检查了 mongo shell 中的 MongoDB 对象,visits相关文档的子文档是一个数组,看起来还可以:

> db.visitors.findOne({_id: ObjectId("...")})
{
    "_id" : ObjectId("..."),
    "visits" : [
        {
            "_id" : ObjectId("..."),
            "date" : ISODate("..."),
            "path" : "/"
        },
        ...
    ]
}

Array 对象如何不可迭代?

标签: javascriptnode.jsmongoose

解决方案


数组在 JS中始终是可迭代的。注意visitors集合中可能缺少visits属性的行。如果该属性不是 MongoDB 中的数组(这是允许的,因为 MongoDB 是 NoSQL 数据库),它仍将被转换为模型定义中的空数组。

在您的具体情况下,您有一个错字:

for (let v of visitors.visits) // plural

应该是

for (let v of visitor.visits) // singular

推荐阅读