【问题标题】:Mongoose Populate with express res.json() breaksMongoose 使用 express res.json() 填充填充
【发布时间】:2015-08-07 03:35:01
【问题描述】:

所以我从 mongodb 中选择 Activity 并为每个填充 User

var query = Activity.find(query).populate("user");
return query.sort({created:"desc"}).exec(function(err, activities) {
    debugger;
    if (!err) {
        return res.json(activities);
    } else {
        res.status(400).json(err);
    }
});

如您所见,我有一个 调试器; 断点在那里,当我执行 activities 时,它会打印一个填充了用户对象的活动数组。 另外,当我调用 activities[0].toJSON() 之类的东西时,一切都很好!

但是响应返回时 user 属性为空!

我查看了 express.response.json(OBJ) 的来源并看到了这一行:

var body = JSON.stringify(val, replacer, spaces); val 是我的活动

当调用JSON.stringify(activities) 时,它将创建一个带有空用户字段的 json。有什么建议吗?

【问题讨论】:

    标签: json node.js mongodb express mongoose


    【解决方案1】:

    Try the lean option. 这会返回没有猫鼬怪异的普通 JS 对象。此外,您的错误处理似乎有点笨拙,可以简化。

    var query = Activity.find(query).populate("user");
    query.sort({created:"desc"}).lean().exec(function(err, activities) {
        if (err) return res.status(400).json(err);
        res.json(activities);
    });
    

    我会更进一步,不是在路由中硬编码错误发送,而是简单地通过 if (err) return next(err) 传递到应用程序中其他地方定义的错误处理中间件。您仍然可以设置状态,然后在中间件中使用检测,如下所示:

    app.use(function(err, req, res, next){
        err.status = err.status || 500;
        res.status(err.status).json(err);
    });
    

    【讨论】:

    • 很好的答案! lean() 确实有效。你写的中间件也不完整吧?这是快递的一个错误?还是猫鼬?到底发生了什么?
    • "这是 express 中的错误?还是 mongoose 中的错误?" —不确定您指的是什么“它”;您最初的问题一定是 Mongoose 的 toObjecttoJSON 方法的问题(当您 res.json 活动时会调用这两种方法。不是错误,而是在对象化填充文档时 Mongoose 的深度问题。中间件是完整的,因为它 res.json 的任何 errs 在路由中传递给 next。如果你想设置状态,那么在路由中你可以这样做:if (err) { err.status = 404; return next(err); }
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 2019-01-31
    • 2019-07-28
    • 2016-07-11
    • 2019-06-25
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多