【问题标题】:Node.Js Express and Mongoose Response Model ModifyNode.Js Express 和 Mongoose 响应模型修改
【发布时间】:2017-08-11 23:36:05
【问题描述】:

我是 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());
    }) 
}
...

不确定“convertToOtherModel”函数是否可以放置在某个地方以便它对用户起作用......但任何关于如何做到这一点的想法都会有所帮助!

【问题讨论】:

  • 不应将function(err, users) 作为回调传递给User.find()
  • 你是对的@singsuyash,我的错。但这不是手头的问题,只是一个错字。尽管如此,还是感谢您的关注:)。现在编辑:)
  • 覆盖架构的 toJSON 方法。详情见我的回答。

标签: javascript node.js mongodb mongoose


【解决方案1】:

你可以这样做来只返回一些属性:

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

见:https://lodash.com/docs/4.17.4#pick

要使用lodash版本你首先需要添加:

const _ = require('lodash');

到您的代码,并在您的项目目录中运行它:

npm install lodash --save

【讨论】:

  • @MerdescuR。请参阅更新的答案以了解不同的方式和第二个选项。
  • 这几乎就是我一直在寻找的东西,我将研究 lodash 看看它“必须提供”什么。我还需要能够在显示之前修改对象的属性。
【解决方案2】:
personSchema
    .virtual('fullName')
    .get(function () {
        return this.name.first + ' ' + this.name.last;
    })
    .set(function (v) {
        this.name.first = v.substr(0, v.indexOf(' '));
        this.name.last = v.substr(v.indexOf(' ') + 1);
    })
  1. 对于FullName 之类的内容,您可以创建virtual 架构。

    链接:http://mongoosejs.com/docs/guide.html

  2. 您必须选择要输出的列,我不确定您是否可以专门将列列入黑名单(所有列减去密码列)

【讨论】:

    【解决方案3】:

    您可以将第二个参数传递给 find() 并指定您想要或不想要返回的字段,而不是让查询返回所有字段

    User.find({}, {password: 0}, function(error, users) {
      console.log(users)
    })
    

    您也可以使用aggregation framework 并通过连接不同字段的值来创建新字段

    User.aggregate([
        {$project: {
            username: '$username',
            fullName: {$concat: ['$firstName', ' ', '$lastName']}
        }}
        ], function(error, users) {
            console.log(users)
        })
    

    【讨论】:

    • 我相信第二个参数最能解决我的问题,因为我确实只想返回用户的特定字段。虽然向用户对象添加另一个属性的聚合解决方案不是那么友好,但我会选择这个作为最佳答案
    【解决方案4】:

    覆盖用户架构的 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);
    }) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 2017-06-13
      • 2014-12-03
      • 2013-09-01
      • 2015-12-06
      • 2015-02-26
      • 2014-07-29
      相关资源
      最近更新 更多