【问题标题】:infinite loop while saving a record in mongo collection在mongo集合中保存记录时的无限循环
【发布时间】:2018-06-20 10:32:42
【问题描述】:

我正在向创建新消息的 API 发出 POST 请求,一旦创建,在 Promise 回调中,我也将消息保存在用户集合中。

看到这一行 - user.messages.push(result); //这里有问题

router.post('/', function (req, res, next) {
    var decoded = jwt.decode(req.query.token);
    User.findById(decoded.user._id, function(err, user){
        if(err){
            return res.status(500).json({
                title: 'An error occured',
                error: err
            });
        }
        var message = new Message({
            content : req.body.content,
            user : user      //add the user to messages as a link
        });
        message.save(function(err, result) {
            if(err){
                return res.status(500).json({
                    title: 'An error occured',
                    error: err
                });
            }
            user.messages.push(result);     //problem here 
            user.save();
            res.status(201).json({
                message: 'Saved message',
                obj: result
            });
        });
    });
});

消息是在消息集合中创建的,但一旦到达突出显示的行,服务器就会陷入无限循环并停止。

这是服务器显示的错误:

【问题讨论】:

  • 我认为这与推送无关。你是在别处调用递归函数吗
  • 不,我没有在任何地方使用显式递归。
  • 好吧,试着编写一个最小的代码来调用 API 并逐步添加函数,直到你遇到问题。因为这段代码中没有任何东西会导致你的错误。
  • 找到解决方案。
  • 在这部分代码中吗?

标签: node.js mongodb express mongoose mean-stack


【解决方案1】:

看到这一行 - user.messages.push(result); //这里有问题

结果包含完整的user 对象,而不是应该保存在消息中的userId

user 对象的结构是这样的

{"_id" : ObjectId("5a570976d911c65410b93dc9"), "firstName" : "Rachit", "lastName" : "Garg", "password" : "$2a$10$24G4Gii0s5ityhtTkeK1m.8C2tPJIyKFbsnMSHCtcWkwz85kmr6iS", "email" : "rachigarg@gmail.com", "messages" : [ ObjectId("5a57099dd911c65410b93dcb") ], "__v" : 35 }

message 对象的结构如下。

{ "_id" : ObjectId("5a57099dd911c65410b93dcb"), "content" : "one more edits", "user" : ObjectId("5a570976d911c65410b93dc9"), "__v" : 0 }

user 应该包含用户创建的messageIds 数组。

message 应该只包含创建消息的userId

由于结果再次包含整个 user 对象,而不仅仅是 userId,因此导致了无限循环。

这里是修复:

user.messages.push(result_id); //问题已解决

【讨论】:

    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2017-10-25
    • 2023-01-12
    • 2012-11-03
    相关资源
    最近更新 更多