超时应用程序级别加入mongoose with express

时间:2018-06-09 14:35:16

标签: node.js express mongoose

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

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

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);
    }
  });
});

不幸的是,我的请求超时,我测试了Postman。 我测试时收到了这条消息:

  

无法得到任何回复

     

连接时出错   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数组中找到查找消息 ... 但似乎我错过了一些东西。

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

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

尝试一些建议:

  1. 确保thread.messages不是空数组。您可以通过声明其长度大于0来完成此操作。
  2. 在Message.find({_ id:{$ in:thread.messages}})子句中,在将字符串值发送到find子句之前将其转换为objectids。所以你可以做到
  3. var myobj1 = [];
    
    thread.messages.forEach(element => {myobj1.push(Mongoose.Types.ObjectId(element)})

答案 1 :(得分:0)

我找到了一个使用Mongoose的 填充 的解决方案及其来源:

  1. http://mongoosejs.com/docs/populate.html
  2. https://alexanderzeitler.com/articles/mongoose-referencing-schema-in-properties-and-arrays/
  3. 修改后的代码:

        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);
              });
          });
        });