node.js - instead - mongoose validation
Mongoose findOneAndUpdate y runValidators no funcionan (4)
los validadores necesarios solo fallan cuando intentas desvincular $ explícitamente la clave.
Esto no tiene sentido para mí, pero es lo que dicen los doctores.
Tengo problemas para intentar que la opción ''runValidators'' funcione. Mi esquema de usuario tiene un campo de correo electrónico que ha requerido que se establezca como verdadero, pero cada vez que se agrega un nuevo usuario a la base de datos (usando la opción ''upsert'') y el campo de correo electrónico está vacío, no se queja:
var userSchema = new mongoose.Schema({
facebookId: {type: Number, required: true},
activated: {type: Boolean, required: true, default: false},
email: {type: String, required: true}
});
código findOneAndUpdate
:
model.user.user.findOneAndUpdate(
{facebookId: request.params.facebookId},
{
$setOnInsert: {
facebookId: request.params.facebookId,
email: request.payload.email,
}
},
{upsert: true,
new: true,
runValidators: true,
setDefaultsOnInsert: true
}, function (err, user) {
if (err) {
console.log(err);
return reply(boom.badRequest(authError));
}
return reply(user);
});
No tengo idea de lo que estoy haciendo mal, acabo de seguir los documentos: http://mongoosejs.com/docs/validation.html
En los documentos se dice lo siguiente:
Tenga en cuenta que en mongoose 4.x, los validadores de actualización solo se ejecutan en las operaciones $ set y $ unset. Por ejemplo, la siguiente actualización tendrá éxito, independientemente del valor del número.
Reemplacé $ setOnInsert con $ set pero tuve el mismo resultado.
Creé un complemento para validar las propiedades del modelo requerido antes de realizar operaciones de actualización en mangosta.
Código de complemento aquí
var mongoose = require(''mongoose'');
var _ = require(''lodash'');
var s = require(''underscore.string'');
function validateExtra(schema, options){
schema.methods.validateRequired = function(){
var deferred = Promise.defer();
var self = this;
try {
_.forEach(this.schema.paths, function (val, key) {
if (val.isRequired && _.isUndefined(self[key])) {
throw new Error(s.humanize(key) + '' is not set and is required'');
}
});
deferred.resolve();
} catch (err){
deferred.reject(err);
}
return deferred.promise;
}
}
module.exports = validateExtra;
Debe llamarse explícitamente como un método del modelo, por lo que recomiendo encadenarlo con una cadena .then
antes de la llamada de actualización.
Plugin en uso aquí
fuelOrderModel(postVars.fuelOrder).validateRequired()
.then(function(){
return fuelOrderModel.findOneAndUpdate({_id: postVars.fuelOrder.fuelOrderId},
postVars.fuelOrder, {runValidators: true, upsert: true,
setDefaultsOnInsert: true, new: true})
.then(function(doc) {
res.json({fuelOrderId: postVars.fuelOrder.fuelOrderId});
});
}, function(err){
global.saveError(err, ''server'', req.user);
res.status(500).json(err);
});
En mangosta haz lo mismo en dos pasos.
- Encuentra el resultado usando el método
findOne()
. - Agregue campos y guarde documentos usando
Model.save()
.
Esto actualizará su documento.
usa este plugin: mongoose-unique-validator
Al utilizar métodos como findOneAndUpdate
, deberá pasar este objeto de configuración:
{runValidators: true, context: ''query''}
es decir.
User.findOneAndUpdate(
{ email: ''[email protected]'' },
{ email: ''[email protected]'' },
{ runValidators: true, context: ''query'' },
function(err) {
// ...
}