覆盖一个猫鼬模型方法

时间:2017-01-24 05:46:29

标签: node.js mongodb express mongoose

我有以下快递路线:

app.post('/users/me',(req, res) => {
  var body =  req.body.email;
  User.find({
    email: body
  }).then((user) => {
    res.send({user});
  }, (e) => {
    res.status(400).send(e);
  });
});

在我的用户模型上,我有以下方法限制返回到电子邮件和_id的结果:

UserSchema.methods.toJSON = function () {
    var user = this;
    var userObject = user.toObject();

    return _.pick(userObject, ['_id', 'email']);
};

在我的大多数路线中,这正是我想要的,但是在这个特定路线中我想要返回其他字段。如何覆盖\绕过模型方法并返回我的字段?

2 个答案:

答案 0 :(得分:2)

我发现我可以创建一个额外的方法并在res.send()中调用它。 例如,如果我想在返回时添加密码,我可以创建一个新的方法:

UserSchema.methods.toPrivateJSON = function () {
    var user = this;
    var userObject = user.toObject();
    return _.pick(userObject, ['_id', 'email', 'activeAccount', 'password']);

};

然后在我的路线中,当我返回用户对象时,我调用

res.send(user.toPrivateJSON());

这将调用toPrivateJSON()方法并返回所需的其他字段。

答案 1 :(得分:0)

app.post('/users/me',(req, res) => {
  var body =  req.body.email;
  User.find({
    email: body
  }).then((user) => {
    user.private = true; //tells to model method to include additional fields
    res.send({user});
  }, (e) => {
    res.status(400).send(e);
  });
});

然后在模型方法中:

UserSchema.methods.toJSON = function () {
    var user = this;
    var userObject = user.toObject();
    if(user.private)
      return _.pick(userObject, ['_id', 'email', 'additionalField']);
    else
      return _.pick(userObject, ['_id', 'email']);
};