我需要编写一个函数,该函数在mongodb中使用_id搜索对象,并且在该对象内部将找到另一个来自不同集合的ID数组, 然后它将使用该ID数组从其他集合中查找名称。
我没有尝试更多的循环,而是直接尝试使用索引进行访问。
Order.findById(orderId)
.then(order => {
if(!order){
console.log('No Order');
return next(new Error('No Order Found'));
}
console.log(order.productId[0]);
console.log('reached here 1');
Product.findById(order.productId[0])
.then( product => {
if(!product){
return res.redirect('/admin/create-subadmin');
}
console.log('inside FindById');
const ProductName1 = product.name;
console.log(ProductName1);
})
.catch(err => console.log(err));
console.log('reached here');
})
.catch(err => {
console.log(err);
});
当前输出:
5cb9e18d6c17f41bacbcdf55 //(id of product[0])
reached here 1
reached here
inside FindById
Titleasd //(name of of product[0])
我不明白为什么它最后出现在Product.findById中。 即console.log('到达此处'); //此行的执行在Product.findById之前
Scheme of Order
{
_id: mongoose.Schema.Types.ObjectId,
orderId:String,
productId:Array
}
Schema of Product
{
product_id: {type: Schema.Types.ObjectId,
},
title: String,
name:{
type: String,
unique: true,
required: true
},
price:Number
}
我希望函数进入Order->进入productId数组->使用这些ID查找所有产品名称和价格,并将它们存储在对象或数组中的任何内容,但我什至无法理解流程现在控制。
答案 0 :(得分:0)
关于流程,您错过了一件事。 Product.findById
是异步的。因此,当您调用它时,当前函数将不会停止并执行下一行console.log('reached here');
。
看下面的例子来了解:
这是您的情况
function promise() {
return new Promise((resolve) => {
console.log('#1 Start promise function execution');
setTimeout(() => {
console.log('#2 Finish promise function execution');
resolve();
}, 1500);
});
}
function test() {
return new Promise((resolve) => {
promise()
.then(() => {
console.log('#3 After the promise function call');
})
.then(resolve);
console.log('#4 End of all');
});
}
test();
这是解决方法
function promise() {
return new Promise((resolve) => {
console.log('#1 Start promise function execution');
setTimeout(() => {
console.log('#2 Finish promise function execution');
resolve();
}, 1500);
});
}
function test() {
return new Promise((resolve) => {
promise()
.then(() => {
console.log('#3 After the promise function call');
})
.then(() => {
console.log('#4 End of all');
resolve();
});
});
}
test();
那您的代码呢?您可以将通话链接
Order.findById(orderId)
.then((order) => {
if (!order) {
console.log('No Order');
return next(new Error('No Order Found'));
}
console.log(order.productId[0]);
console.log('reached here 1');
return Product.findById(order.productId[0]);
})
.then((product) => {
if (!product) {
return res.redirect('/admin/create-subadmin');
}
console.log('inside FindById');
const ProductName1 = product.name;
console.log(ProductName1);
})
.then(() => {
console.log('reached here');
})
.catch(err => {
console.log(err);
});