validate instead ensureindex deprecationwarning createindexes collection node.js mongodb validation mongoose

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.

  1. Encuentra el resultado usando el método findOne() .
  2. 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) { // ... }