javascript - 数组对象不可迭代
问题描述
我在 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 对象如何不可迭代?
解决方案
数组在 JS中始终是可迭代的。注意visitors
集合中可能缺少visits
属性的行。如果该属性不是 MongoDB 中的数组(这是允许的,因为 MongoDB 是 NoSQL 数据库),它仍将被转换为模型定义中的空数组。
在您的具体情况下,您有一个错字:
for (let v of visitors.visits) // plural
应该是
for (let v of visitor.visits) // singular
推荐阅读
- testing - 从使用testcafe开源升级到studio有用吗?
- ansible - 在 Ansible 中,如何将活动角色中的变量组合到一个数组中?
- django - List API 视图返回空对象的列表
- reactjs - React 脚本启动给出了 Unexpected token 错误
- android - 2019年用GoogleMaps V1编译安卓应用
- c++ - 内联显示链表
- laravel - 搜索查询只返回一个用户
- python - 我在 pycharm 中导入 nmap 时遇到问题
- c# - 在 Windows 应用程序中导出数据时向 Excel 文件添加多个标题文本
- python - 如何在 SQL Server 管理工作室中运行 exe 文件