【问题标题】:MongoDb NodeJs RangeError: Maximum call stack size exceeded when pushing messageMongoDb NodeJs RangeError:推送消息时超出最大调用堆栈大小
【发布时间】:2018-06-26 22:06:13
【问题描述】:

我正在学习如何创建 MEAN 应用程序,当我尝试将消息推送到我的用户模型中的消息数组时遇到问题。 我可以创建一条新消息并传递用户对象,但是当尝试将消息对象传递到 user.messages 数组时,我在控制台中收到错误“RangeError:超出最大调用堆栈大小”。

我将发布我的用户和消息模型以及消息路由代码。

消息模型

let mongoose = require('mongoose');
let Schema = mongoose.Schema;
let User = require('./user');


let schema = new Schema({
    content: {
        type: String,
        required: true
    },
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
});

module.exports = mongoose.model('Message', schema);

用户模型

let mongoose = require('mongoose');
let Schema = mongoose.Schema;
let mongooseUniqueValidator = require('mongoose-unique-validator');

let schema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    messages: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Message'
    }]
});

schema.plugin(mongooseUniqueValidator);

module.exports = mongoose.model('User', schema);

还有我的路线代码

let express = require('express');
let router = express.Router();
let jwt = require('jsonwebtoken');
let User = require('../models/user');
let Message = require('../models/message');

router.get('/', function (req, res, next) {
    Message.find()
        .exec(function (err, messages) {
            if (err) {
                return res.status(500).json({
                    title: 'An error occurred',
                    error: err
                });
            }
            res.status(200).json({
                message: 'Success',
                obj: messages
            });
        });
});

// Protect Routes
router.use('/', (req, res, next) => {
    jwt.verify(req.query.token, 'secret', (err, decoded) => {
        if (err) {
            return res.status(401).json({
                title: 'Not Authenticated',
                error: err
            });
        }
        next();
    });
});

router.post('/', (req, res, next) => {
    let decoded = jwt.decode(req.query.token);
    User.findById(decoded.user._id, (err, user) => {
        if (err) {
            return res.status(500).json({
                title: 'An error occurred',
                error: err
            });
        }
        let message = new Message({
            content: req.body.content,
            user: user
        });
        message.save((err, result) => {
            if (err) {
                return res.status(500).json({
                    title: 'An error occurred',
                    error: err
                });
            }

            user.messages.push(result);
            user.save();
            res.status(201).json({
                message: 'Saved message',
                obj: result
            });
        });
    });
});


module.exports = router;

我相信问题来自于发布路线

user.messages.push(result);

谢谢

【问题讨论】:

  • 我认为您对用户和消息对象有循环依赖。您在消息对象内部调用 user.save() 并且 User 是消息对象的属性。我敢打赌问题来了,你能告诉我们 user.save() 方法吗?
  • .save() 是一种在数据库中持久化的 mongodb 方法。即使我只是推送到数组而不保存,我仍然会收到错误

标签: mongodb angular express mongoose


【解决方案1】:

您在架构中使用 refs,因此您应该存储 _id 值而不是整个对象:

...

let message = new Message({
  content: req.body.content,
  user: user._id
})

...

...和:

user.messages.push(result._id)

我希望这有助于解决您的问题。

【讨论】:

  • 我之前尝试过,但我得到'TypeError:无法读取未定义的属性'push'但我可以记录用户并返回一个值,并将用户ID存储在消息中对象。
  • 如果之前没有添加任何消息,您可能没有 messages 属性。尝试添加条件:如果 messages 不存在,则将其设置为仅包含新用户 ID 的数组。如果确实存在,则使用 push。
  • 您还可以在空数组的架构中设置默认值。此处的文档:mongoosejs.com/docs/defaults.html
  • 我最终通过将 { usePushEach: true } 添加到我的用户模型来修复它,感谢您的帮助
猜你喜欢
  • 2019-07-05
  • 2014-02-07
  • 1970-01-01
  • 2020-04-14
  • 2013-08-18
  • 2015-06-28
  • 2017-09-02
  • 2018-02-06
相关资源
最近更新 更多