Javascript Js Express和Mongoose响应模型修改
我对Node.js开发还很陌生。尽管我有一些异步函数的经验,但是回调仍然让我非常吃惊 我正在使用mongoose的.find()函数在数据库中搜索用户集合。问题是我也想显示这些用户,但我不想显示数据库中所有可用的属性Javascript Js Express和Mongoose响应模型修改,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我对Node.js开发还很陌生。尽管我有一些异步函数的经验,但是回调仍然让我非常吃惊 我正在使用mongoose的.find()函数在数据库中搜索用户集合。问题是我也想显示这些用户,但我不想显示数据库中所有可用的属性 ... function(req,res){ User.find(function(err,users){ res.json(users); }) } ... 这就是我目前获取数据库中所有用户的方式,但这也会返回密码和其他敏感信息。我想知道如何最
...
function(req,res){
User.find(function(err,users){
res.json(users);
})
}
...
这就是我目前获取数据库中所有用户的方式,但这也会返回密码和其他敏感信息。我想知道如何最有效地将这些数据“转换”为同一对象,而不使用某些属性,或者添加由firstName+lastName组成的“fullName”
因此,当返回所有用户时,我希望
...
function(req,res){
User.find(function(err,users){
res.json(users.convertToOtherModel());
})
}
...
不确定“ConvertToutherModel”函数是否可以放在某个地方,以便在用户身上工作。。。但任何关于如何做到这一点的想法都会有所帮助 您可以这样做,只返回一些属性:
function filterUser(user) {
let { property1, property2 } = user;
return { property1, property2 };
}
res.json( users.map(filterUser) );
或者使用lodash的更轻便的方式:
res.json( users.map(user => _.pick(user, ['prop1', 'prop2']));
见:
要使用lodash版本,首先需要添加:
const _ = require('lodash');
添加到您的代码中,并在项目目录中运行:
npm install lodash --save
您可以执行以下操作以仅返回部分属性:
function filterUser(user) {
let { property1, property2 } = user;
return { property1, property2 };
}
res.json( users.map(filterUser) );
或者使用lodash的更轻便的方式:
res.json( users.map(user => _.pick(user, ['prop1', 'prop2']));
见:
要使用lodash版本,首先需要添加:
const _ = require('lodash');
添加到您的代码中,并在项目目录中运行:
npm install lodash --save
FullName
之类的内容,您可以创建virtual
schema
链接此处:FullName
之类的内容,您可以创建virtual
schema
链接此处:您可以将第二个参数传递给
find()
,并指定希望返回或不希望返回的字段,而不是通过查询返回所有字段
User.find({}, {password: 0}, function(error, users) {
console.log(users)
})
您还可以通过合并不同字段的值来使用和创建新字段
User.aggregate([
{$project: {
username: '$username',
fullName: {$concat: ['$firstName', ' ', '$lastName']}
}}
], function(error, users) {
console.log(users)
})
您可以将第二个参数传递给
find()
,并指定希望返回或不希望返回的字段,而不是通过查询返回所有字段
User.find({}, {password: 0}, function(error, users) {
console.log(users)
})
您还可以通过合并不同字段的值来使用和创建新字段
User.aggregate([
{$project: {
username: '$username',
fullName: {$concat: ['$firstName', ' ', '$lastName']}
}}
], function(error, users) {
console.log(users)
})
重写用户模式的
toJSON
方法
UserSchema.methods.toJSON = function () {
var user = this;
// Modify your document object here
return { fullName: user.firstName + " " + user.lastName }
// Pick other fields too if you want
// _.pick(user, ["otherField"]);
};
然后像这样发送他们-
User.find(function(err,users){
res.json(users);
})
重写用户模式的
toJSON
方法
UserSchema.methods.toJSON = function () {
var user = this;
// Modify your document object here
return { fullName: user.firstName + " " + user.lastName }
// Pick other fields too if you want
// _.pick(user, ["otherField"]);
};
然后像这样发送他们-
User.find(function(err,users){
res.json(users);
})
@梅德斯库。以另一种方式和第二种选择查看更新的答案。这正是我所寻找的,我将查看lodash以了解它“必须提供”的内容。我还需要能够在显示对象之前修改它的属性。@MerdescuR。以另一种方式和第二种选择查看更新的答案。这正是我所寻找的,我将查看lodash以了解它“必须提供”的内容。我还需要能够在显示对象之前修改对象的属性。不应该将
函数(err,users)
作为回调传递给User.find()
你是对的@singsuyash,我的错。但这不是手头的问题,只是一个打字错误。不过,感谢您的关注:)。现在编辑:)覆盖模式的toJSON
方法。有关详细信息,请参见我的答案。function(err,users)
不应该作为回调传递给User.find()
你是对的@singsuyash,我的坏消息。但这不是手头的问题,只是一个打字错误。不过,感谢您的关注:)。现在编辑:)覆盖模式的toJSON
方法。我相信第二个参数最能解决我的问题,因为我只想返回用户的特定字段。虽然向用户对象添加另一个属性的聚合解决方案不是很友好,但我会选择这个作为最佳答案。我相信第二个参数最能解决我的问题,因为我只想返回用户的特定字段。虽然将另一个属性添加到用户对象的聚合解决方案不是很友好,但我会选择这个作为最佳答案