Javascript Js Express和Mongoose响应模型修改

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); }) } ... 这就是我目前获取数据库中所有用户的方式,但这也会返回密码和其他敏感信息。我想知道如何最

我对Node.js开发还很陌生。尽管我有一些异步函数的经验,但是回调仍然让我非常吃惊

我正在使用mongoose的.find()函数在数据库中搜索用户集合。问题是我也想显示这些用户,但我不想显示数据库中所有可用的属性

...
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
    方法。我相信第二个参数最能解决我的问题,因为我只想返回用户的特定字段。虽然向用户对象添加另一个属性的聚合解决方案不是很友好,但我会选择这个作为最佳答案。我相信第二个参数最能解决我的问题,因为我只想返回用户的特定字段。虽然将另一个属性添加到用户对象的聚合解决方案不是很友好,但我会选择这个作为最佳答案