在将其发送到视图(节点 js)之前,无法更改路由中 MongoDB/MongooseJS 的结果

Posted

技术标签:

【中文标题】在将其发送到视图(节点 js)之前,无法更改路由中 MongoDB/MongooseJS 的结果【英文标题】:Can't change result from MongoDB/MongooseJS in route before sending it to the view (Node js) 【发布时间】:2014-10-30 03:21:28 【问题描述】:

在我的路线中,我试图替换从数据库中获取的任何值,然后再将其发送到我的视图。

在这种情况下,我试图用用户的用户名替换对用户的引用。但是我的 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);
    );
);

这是我的控制台返回的内容:

some@email.com
540468daeb56d5081ade600d
[  _id: 54084cacf212815422aabe94,
    from: 540468daeb56d5081ade600d,
    to: 5406bf4c8a8acc88120922dc,
    headline: 'Some Headline',
text: 'Some text',
__v: 0  ]

【问题讨论】:

***.com/questions/9952649/…的可能重复 【参考方案1】:

从查找请求返回的是一个“猫鼬文档”,它实际上非常复杂,包含来自关联模式的所有规则和方法。您不能在架构上设置的约束之外修改它。

因此,尽管序列化形式很简单,但对象却相当复杂。您想要的只是一个基本对象,因此您可以随意修改它。简而言之,只需调用 .toObject() 即可获取“原始”javascript 对象,而无需其他糖分:

inbox = result[0].toObject();
users = result[0].toObject();

基本对象没有方法也没有规则。修改掉。

【讨论】:

我在其他地方找到了这个解决方案,但它一直返回“没有方法'toObject'” @JesperNielsen 那么为什么将您的标题更改为(已解决)?它要么有效,要么无效 @NielLunn - 看看我更新的帖子。我找到了自己的解决方案。 @JesperNielsen 仍然不明白为什么这不是一个解决方案,因为它适用于我和其他使用猫鼬的人。当然,您可以像您所做的那样手动将每个属性分配给一个新对象,但我不称之为解决方案。 我后来让它工作了。我遇到了一个问题,我无法访问任何猫鼬功能。我现在已经解决了这个问题,.toObject 现在可以正常工作了。【参考方案2】:

OP 的解决方案。

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

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

【讨论】:

【参考方案3】:
/*
 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';

【讨论】:

尝试在您的代码中添加一些描述以澄清您的代码的作用?它是如何解决问题的?

以上是关于在将其发送到视图(节点 js)之前,无法更改路由中 MongoDB/MongooseJS 的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用节点 js 将我的 json 发送到我的视图

路由器是不是需要更改传入 IP 数据包中的任何字段,然后才能将其发送到传出链路上?为啥?

在将其保存在服务器上之前更改 mime 类型的图片

无法使用CIFilter从CIImage中提取UIImage

设置标签的文本会导致堆栈视图布局问题

在将 HTML 字符串发送到客户端之前格式化 HTML 字符串的 C# 工具[关闭]