超时应用程序级加入猫鼬与快递



我在两个文档之间的应用程序级联接超时:线程和消息。

我正在尝试使用以下代码获取线程的所有消息

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
} 

根据我的理解,我的请求应该在我的线程消息数组中查找消息... 但我似乎错过了一些东西。

有什么想法来解决我的超时请求吗?

非常感谢您的帮助。

几个尝试建议:

  1. 确保 thread.messages 不是一个空数组。您可以通过断言其长度大于 0 来执行此操作。
  2. 在子句 Message.find({ _id: { $in: thread.messages } }( 中,在将字符串值发送到 find 子句之前,将字符串值强制转换为 objectid。所以你可以做

var myobj1 = [];
thread.messages.forEach(element => {myobj1.push(Mongoose.Types.ObjectId(element)})

我用猫鼬的填充和这些来源找到了解决方案:

  1. http://mongoosejs.com/docs/populate.html
  2. 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);
});
});
});

最新更新