使用MongoDB和mongoose验证用户输入?

时间:2016-01-06 08:55:10

标签: node.js mongodb validation mongoose

我会使用统一的方法来假设用户输入来验证我的模式,因此不仅在save / update上应用内置验证,而且还在find()等上应用。

var User = mongoose.model("User", new Schema({
    name:   {type: String, minlength: 5, maxlength: 128, required: true, unique: true});
}));

我想要的是每次在使用mongoose运行查询之前运行验证器,以确保用户输入符合全局架构规则。

在我的路线中有类似的东西:

var username = $.get["username"], //An input from GET querystring

User = mongoose.model("User");

User.validate({name: username}, function(err) {
    if (err) return console.log("not valid input"); //i.e. too short

    //run query if valid
});

是否有插件(假设我没有使用Express)或者其他已经包含在mongoose中?

1 个答案:

答案 0 :(得分:1)

文档:http://mongoosejs.com/docs/validation.html 默认情况下,它在mongoose中受支持。如果您在每次保存操作之前寻找通用验证,则可以指定要验证的字段path和验证validate(function(valueEntered, howToRespond)。如果未通过验证,则将抛出错误,如下例所示。

示例:为方便起见,使用蓝鸟。以下代码段会在每次保存操作之前验证电子邮件。

var mongoose = require('bluebird').promisifyAll(require('mongoose'));
var Schema = mongoose.Schema;
var UserSchema = new Schema({
  name: String,
  email: {
    type: String,
    lowercase: true
  },
  password: String,
});

UserSchema
  .path('email')
  .validate(function(value, respond) {
    var self = this;
    return this.constructor.findOneAsync({ email: value })
      .then(function(user) {
        if (user) {
          if (self.id === user.id) {
            return respond(true);
          }
          return respond(false);
        }
        return respond(true);
      })
      .catch(function(err) {
        throw err;
      });
  }, 'The specified email address is already in use.');