Mongoose模式:验证唯一字段,不区分大小写

时间:2012-12-21 14:05:38

标签: node.js validation mongodb express mongoose

我有userSchema这样:

var userSchema = new Schema({
    name: {
      type: String
    , required: true
    , validate: [validators.notEmpty, 'Name is empty']
    }
  , username: {
      type: String
    , required: true
    , unique: true
    , validate: [validators.notEmpty, 'Username is empty']
    }
});

username字段应该是唯一的。如果此用户名已存在于数据库中,则Mongoose将抛出错误。但是,它不是不区分大小写的,我需要它。

我是否正确地认为实现不区分大小写的唯一检查的唯一方法是编写我自己的验证规则,该规则将对集合执行查询?可以这样编写验证检查,创建更多与集合的连接吗?我也需要为email做类似的事情。

9 个答案:

答案 0 :(得分:14)

如何使用:

{ type: String, lowercase: true, trim: true }

达到你的目的?

答案 1 :(得分:3)

...在NodeJS上带有猫鼬查询:

public static class FunctionsAssemblyResolver
{
    #region Public Methods

    public static void RedirectAssembly()
    {
        AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblyOnCurrentDomain;
    }

    #endregion Public Methods

    #region Private Methods

    private static Assembly ResolveAssemblyOnCurrentDomain(object sender, ResolveEventArgs args)
    {
        var requestedAssembly = new AssemblyName(args.Name);
        var assembly = default(Assembly);

        AppDomain.CurrentDomain.AssemblyResolve -= ResolveAssemblyOnCurrentDomain;

        try
        {
            assembly = Assembly.Load(requestedAssembly.Name);
        }
        catch
        { }

        AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblyOnCurrentDomain;

        return assembly;
    }

    #endregion Private Methods
}

const countryName = req.params.country;

{ 'country': new RegExp(`^${countryName}$`, 'i') };

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

// ^australia$

MongoDB上带有Mongoose ORM的Javascript NodeJS完整代码示例

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };

// ^turkey$

答案 2 :(得分:2)

我不知道你是否在节点中这样做。但您可以使用这样的npm:https://github.com/blakehaswell/mongoose-unique-validator来检查集合字段的唯一验证。其他方式可能是每次新请求到来时检查集合。 http://timstermatic.github.io/blog/2013/08/06/async-unique-validation-with-expressjs-and-mongoose/ 您可以在此处参考材料,并以适合您情况的方式使用它。

答案 3 :(得分:1)

最好的方法是使用已存在的npm包,如下所示。     https://www.npmjs.com/package/mongoose-unique-validator

要使其区分大小写,您可以在同一页面中关注uniqueCaseInsensitive

当已有可用的包时,无需编写自己的验证逻辑(也可以Avinash's post跟踪)。

答案 4 :(得分:1)

索引上带有strength: 2的{​​{3}}解决了这个问题。

index: {
  unique: true,
  collation: {
    locale: 'en',
    strength: 2
  }
}

按如下所示将其放入您的架构创建代码中:

var userSchema = new Schema({
  ...
  username: {
    type: String,
    required: true,
    index: {
      unique: true,
      collation: { locale: 'en', strength: 2 }
    }
});

注意:请确保模型上的索引已更新-您可能需要手动执行。

答案 5 :(得分:1)

在处理项目时遇到相同的问题。我只用两行代码就可以使其变得简单。将所有传入的值转换为小写字母。

let getUsername = req.body.username;
let username = getUsername.toLowerCase();

答案 6 :(得分:0)

非常简单的解决方案

Module#autoload

在这里,如果存在相同的字段,我正在使用异步验证并检查我的模型username : { trim:true, //lowercase:true, type:String, required:[true, '{PATH} is required.'], match : [ new RegExp('^[a-z0-9_.-]+$', 'i'), '{PATH} \'{VALUE}\' is not valid. Use only letters, numbers, underscore or dot.' ], minlength:5, maxlength:30, //unique:true validate : [ function(un, cb){ console.log(v); student.findOne({username:/^un$/i}, function(err, doc){ if(err) return console.log(err); if(!_.isEmpty(doc)) return cb(false); return cb(true); }); }, 'Username already exists.' ] }, 。如果你愿意,显然可以使用正则表达式。

但我不推荐这种方法,它只是不适合我。

反而坚持student方法并将原始用户名复制到其他字段以备不时之需。

答案 7 :(得分:0)

我使用mongoose-unique-validator

示例:

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const { Schema } = mongoose;

const UserSchema = new Schema({
  name: {
    type: String,
    required: true,
    unique: true,
    index: true,
    maxlength: 100,
    trim: true,
    uniqueCaseInsensitive: true
  },
  username: {
    type: String,
    required: true,
    unique: true,
    index: true,
    maxlength: 100,
    trim: true,
    uniqueCaseInsensitive: true
  }
});

UserSchema.plugin(uniqueValidator, {
  message: 'Error, expected {PATH} to be unique.'
});

module.exports = mongoose.model('User', UserSchema);

答案 8 :(得分:-2)

使用正则表达式怎么样?

var pattern = [ /some pattern/, "{VALUE} is not a valid user name!" ];

{ type: String, match: pattern }

供进一步参考:http://mongoosejs.com/docs/api.html#schematype_SchemaType-required