在将其发送到视图(节点 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 的结果的主要内容,如果未能解决你的问题,请参考以下文章
路由器是不是需要更改传入 IP 数据包中的任何字段,然后才能将其发送到传出链路上?为啥?