我在两个文档之间的应用程序级联接超时:线程和消息。
我正在尝试使用以下代码获取线程的所有消息:
router.get('/:themeId/threads/:threadId/messages', function(req, res, next) {
Thread.findById(req.params.threadId, function(err, thread) {
if (err) return next(err);
Message.find({ _id: { $in: thread.messages } }), function(err, message) {
if (err) return next(err);
res.json(message);
}
});
});
不幸的是,我的请求超时,我测试了邮递员。 我在测试它时收到以下消息:
无法得到任何响应
连接到 时出错 http://localhost:3000/api/themes/5b1bb59d4210c50cf798da57/threads/5b1bb5e84210c50cf798da59/messages。
我还检查了thread.messages
是一个带有另一个请求的数组:
获取 http://localhost:3000/api/themes/5b1bb59d4210c50cf798da57/threads/5b1bb5e84210c50cf798da59:
结果如下,来自我的Thread
文档:
{
"numberOfViews": 0,
"numberOfComments": 0,
"numberOfLikes": 0,
"numberOfThanks": 0,
"messages": [
"5b1bb5ad4210c50cf798da58",
"5b1bb6464210c50cf798da5a"
],
"_id": "5b1bb5e84210c50cf798da59",
"theme": "5b1bb59d4210c50cf798da57",
"title": "Title azerty",
"createdAt": "2018-06-09T11:11:36.358Z",
"updatedAt": "2018-06-09T11:13:41.062Z",
"__v": 1
}
根据我的理解,我的请求应该在我的线程消息数组中查找消息... 但我似乎错过了一些东西。
有什么想法来解决我的超时请求吗?
非常感谢您的帮助。
几个尝试建议:
- 确保 thread.messages 不是一个空数组。您可以通过断言其长度大于 0 来执行此操作。
- 在子句 Message.find({ _id: { $in: thread.messages } }( 中,在将字符串值发送到 find 子句之前,将字符串值强制转换为 objectid。所以你可以做
var myobj1 = [];
thread.messages.forEach(element => {myobj1.push(Mongoose.Types.ObjectId(element)})
我用猫鼬的填充和这些来源找到了解决方案:
- http://mongoosejs.com/docs/populate.html
- https://alexanderzeitler.com/articles/mongoose-referencing-schema-in-properties-and-arrays/
在修改后的代码下方:
router.get('/:themeId/threads/:threadId/messages', function(req, res, next) {
Thread.findById(req.params.threadId, function(err, thread) {
if (err) return next(err);
Message.find({_id: { $in : thread.messages } } )
.populate('messages')
.exec(function(error, messages) {
res.json(messages);
});
});
});