【发布时间】:2021-07-03 23:24:34
【问题描述】:
以下代码在快速路由处理程序中循环编写;
const projects = await Projects.find({});//working fine
for (let i = 0; i < projects.length; i++) {
const project = projects[i];
const build = await Build.find({ id: project.latest_build});
//logger.debug(build[0].status); //error
const features = await Feature.find({ build_id: project.latest_build});
logger.debug(features[0].status);
}
上面的代码在第 4 行给出了错误。
(node:672375) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'status' of undefined
但是,它已正确打印在日志中。似乎变量的值被一个承诺懒惰地填充。
但是第 6 行总是可以正常工作。
注意:我没有对上述集合执行任何其他读/写操作。
更新
-
id是Build集合的唯一键。 -
build_id是Feature集合的普通字段。
架构和文档是这样创建的
Schemas.Projects = new mongoose.Schema({
id: {
type: String,
unique: true
},
title: String,
latest_build: String
});
Schemas.Build = new mongoose.Schema({
id: {
type: String,
unique: true
},
run_date: Date,
status: String,
});
Schemas.Feature = new mongoose.Schema({
id : String,
build_id: String,
summary : String,
status: String,
flows: Number,
});
const Projects = mongoose.model('Projects', Schemas.Projects);
const Build = mongoose.model(`Build_${projId}`, Schemas.Build);
const Feature = mongoose.model(`Feature_${projId}`, Schemas.Feature);
【问题讨论】:
-
> 似乎变量的值被一个承诺懒惰地填充。 - 不,这不对。您可以尝试直接在 mongo 中执行相同的查询吗?构建模型是如何定义的?
-
在 mongo 中工作正常。
id是Build模型中的唯一键。我已经更新了同样的问题。 -
第 2 行记录了正确的值,然后仍然抛出错误?
-
@raina77ow 我已经用
Build模式更新了这个问题。这是你要的吗?logger.debug(build)打印[ { _id: 60e048a6d62e4f2c71363796, id: '1', run_date: 2021-07-03T11:23:18.934Z, status: 'passed', __v: 0 } ] -
@TusharShahi 是的。即使此代码正确记录但给出错误
Build.find({ id: project.latest_build}, (err,docs) => { logger.debug(docs[0].status); });
标签: node.js mongoose async-await