Tengo la siguiente ruta expresa:
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); }); });En mi modelo de usuario, tengo el siguiente método que limita los resultados devueltos al correo electrónico y _id:
UserSchema.methods.toJSON = function () { var user = this; var userObject = user.toObject(); return _.pick(userObject, ['_id', 'email']); };En la mayoría de mis rutas, eso es exactamente lo que quiero, sin embargo, en esta ruta en particular me gustaría devolver campos adicionales. ¿Cómo puedo anular/omitir el método del modelo y recuperar mis campos?
Descubrí que puedo crear un método adicional y llamarlo en res.send(). Por ejemplo, si quisiera agregar una contraseña como parte de la devolución, puedo crear un nuevo método:
UserSchema.methods.toPrivateJSON = function () { var user = this; var userObject = user.toObject(); return _.pick(userObject, ['_id', 'email', 'activeAccount', 'password']); };Luego, en mi ruta, cuando devuelvo el objeto de usuario, llamo
res.send(user.toPrivateJSON()); Esto invocará el método toPrivateJSON() y devolverá los campos adicionales necesarios.
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); }); });Luego en el método del modelo:
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']); };