Node.js Can';在将结果发送到视图(节点js)之前,不要更改路由中来自MongoDB/MongooseJS的结果

Node.js Can';在将结果发送到视图(节点js)之前,不要更改路由中来自MongoDB/MongooseJS的结果,node.js,mongodb,view,routes,mongoose,Node.js,Mongodb,View,Routes,Mongoose,在我的过程中,我试图在将其发送到视图之前替换从数据库中获得的任何值 在本例中,我尝试将对用户的引用替换为用户用户名。但是我的console.log只是保持返回值不变 app.get('/message/inbox', function(req, res) { var _id = req.user._id; var inbox = null; var users = null; async.parallel([ function(callback){

在我的过程中,我试图在将其发送到视图之前替换从数据库中获得的任何值

在本例中,我尝试将对用户的引用替换为用户用户名。但是我的console.log只是保持返回值不变

app.get('/message/inbox', function(req, res) {
    var _id = req.user._id;
    var inbox = null;
    var users = null;
    async.parallel([
        function(callback){
            Inbox.find({to: _id}, callback);
        },
        function(callback){
            User.find({}, callback);
        }
    ],
    function(err, result){
        inbox = result[0];
        users = result[1];
        for(var i = 0; i < inbox.length; i++) {
            for(var j = 0; j < users.length; j++) {
                if(String(inbox[i].from) == String(users[j]._id)) {
                    inbox[i].from = users[j].local.username;
                    console.log(users[j].local.username);
                    console.log(inbox[i].from);
                    break;
                }
            } 
        }
        console.log(inbox);
    });
});

从find请求返回的是一个“mongoose文档”,它实际上相当复杂,包含来自关联模式的所有规则和方法。您不能在架构上设置的约束之外修改此内容

因此,尽管有简单的序列化形式,对象还是相当复杂的。您需要的只是一个基本对象,因此您可以随意修改它。简单地说,只需调用
.toObject()
即可获得“原始”JavaScript对象,而不需要剩下的糖:

inbox = result[0].toObject();
users = result[0].toObject();
基本对象没有方法和规则。修改掉。

通过OP解决方案

我只需要在.find之后添加一个.lean()。这告诉mongoose将数据作为javascript对象而不是MongooseDocument传递-

app.get('/message/inbox',函数(req,res){
变量_id=请求用户_id;
var=null;
var用户=null;
异步并行([
函数(回调){
find({to:_id},callback).lean();
},
函数(回调){
User.find({},callback.lean();
}
],
函数(错误、结果){
收件箱=结果[0];
用户=结果[1];
对于(var i=0;i
我在其他地方找到了此解决方案,但它不断返回“没有方法‘toObject’”@JesperNielsen,那么为什么要将标题更改为(已解决)?它要么有效,要么无效t@NielLunn-看看我更新的帖子。我找到了自己的解决方案。@JesperNielsen仍然不明白为什么这不是一个解决方案,因为它适用于我和其他使用mongoose的人。当然,您可以像以前那样手动将每个属性分配给一个新对象,但我不认为这是一个解决方案。我后来让它工作了。我有一个问题,我没有访问任何猫鼬功能。我现在已经解决了这个问题。toObject现在应该可以正常工作了。请尝试在代码中添加一些说明,以澄清代码的作用?它是如何解决问题的?可能重复的
inbox = result[0].toObject();
users = result[0].toObject();
app.get('/message/inbox', function(req, res) {
    var _id = req.user._id;
    var inbox = null;
    var users = null;
    async.parallel([
        function(callback){
            Inbox.find({to: _id}, callback).lean();
        },
        function(callback){
            User.find({}, callback).lean();
        }
    ],
    function(err, result){
        inbox = result[0];
        users = result[1];
        for(var i = 0; i < inbox.length; i++) {
            for(var j = 0; j < users.length; j++) {
                if(String(inbox[i].from) == String(users[j]._id)) {
                    inbox[i].from = users[j].local.username;
                    console.log(users[j].local.username);
                    console.log(inbox[i].from);
                    break;
                }
            } 
        }
        console.log(inbox);
    });
});
/*
 you just need to add .lean() at the end of mongoose query where you want to change the object later stage.
*/
let forExample = aysnc (req, res, next ) => {
let foundUser = await user.find({ organisationId: 10 }); // without lean
foundUser.map(elem => {
  elem.userName = elem.name;
  delete elem;
});
console.log(foundUser[0]); // it will return { name:'something'};
// but if you try:
let foundUser = await user.find({ organisationId: 10 }).lean();// with lean
foundUser.map(elem => {
  elem.userName = elem.name;
  delete elem;
});
console.log(foundUser[0]); // it will return { userName:'something'};