【问题标题】:Validation on user inputs with MongoDB and mongoose?使用 MongoDB 和 mongoose 验证用户输入?
【发布时间】:2016-04-10 07:12:54
【问题描述】:

假设用户输入,我将采用统一的方法来验证我的模式,因此不仅在保存/更新上应用内置验证,而且在 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 中的插件?

【问题讨论】:

    标签: node.js mongodb validation mongoose


    【解决方案1】:

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

    示例:为方便起见使用 bluebird。以下 sn-p 在每次保存操作之前验证电子邮件。

    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.');

    【讨论】:

    • 内置验证只适用于$set/$unset操作,不符合题主要求。
    • 不太明白,查找验证的用例是什么。举个例子就好了
    • new Schema({name: {type: String, trim: true, required: true, lowercase: true}});假设用户输入一个带有未修剪空格的名称;如果没有验证和强制转换,输入字符串将不会被修剪并且查询不会给出正确的结果..或者如果输入必须在查询之前小写..或者甚至,如果用户提供空输入和架构要求字符串不为空,查询将同样执行。我知道我可以简单地在查询之前放置一个条件,但这不会是全局验证/强制转换/等等。根据问题:)
    • 您当然可以实现自定义查找方法,但它与验证无关。定义验证仅应用于保存/更新操作。如果需要给模型添加一些自定义方法,可以使用statics。例如:UserSchema.statics.findByName = function (name, cb) { return this.find({ name: new RegExp(name, 'i') }, cb); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2020-08-01
    • 1970-01-01
    • 2019-03-08
    • 2014-05-26
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多