覆盖 Mongoose 模型方法

31moq8wy  于 2023-02-16  发布在  Go
关注(0)|答案(3)|浏览(129)

我有以下的快速路线:

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);
  });
});

在我的用户模型中,我使用了以下方法来限制返回到email和_id的结果:

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

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

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

ki0zmccv

ki0zmccv1#

我发现我可以创建一个额外的方法,并在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()方法并返回所需的其他字段。

bqjvbblv

bqjvbblv2#

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

llmtgqce3#

您也可以在C:\server\node_modules\mongoose\lib\index.js中将覆盖值从非真更改为真,即if(_mongoose.models.hasOwnProperty(name)&& options.cache!==假&& overwriteModels!==真)更改!===真到=.=真

相关问题