简体   繁体   English

使用Mongoose模式验证用户名

[英]Validating username with Mongoose schema

I'm trying to validate username before save it to mongodb. 我正在尝试先验证用户名,然后再将其保存到mongodb。 But instead saving or validation message i see the following message in terminal: 但是相反,保存或验证消息是我在终端中看到以下消息:

" if(user.path(username)){ TypeError: user.path is not a function" “ if(user.path(username)){TypeError:user.path不是函数”

What does it means? 这是什么意思? I am newbie. 我是新手。

Here is my user.js 这是我的user.js

var User = require('models/user').User;
var HttpError = require('error').HttpError;
var async = require('async');


exports.get = function(req, res) {
res.render('login', { title: 'Login'});
};

exports.post = function(req, res, next) {
  var username = req.body.username;
  var password = req.body.password;

async.waterfall([
    function(callback) {
        User.findOne({username: username}, callback);
    },
    function(user, callback) {
        if (user) {
            if (user.checkPassword(password)) {
                callback(null, user);
            } else {
                next(new HttpError(403, "wrong password"));
            }
        } else {
            var user = new User({username: username, password: password});
            if(user.path(username)){
                callback(null, user);
                user.save(function(err) {
                    console.log(err.message)
                    if (err)
                        return next(err);
                    callback(user);
                });
            }else{ next(new HttpError(403, "Incorrect username"));

            };
        }
    }
], function(err, user){
    if (err) return next(err);
    req.session.user = user._id;
    res.send({});
});

and here is my login.js 这是我的login.js

var crypto = require('crypto');

var mongoose = require('lib/mongoose'),
Schema = mongoose.Schema;

var schema = new Schema({
username: {
    type: String,
    unique: true,
    required: true
},

hashedPassword: {
    type: String,
    required: true
},
salt: {
    type: String,
    required: true
},
created: {
    type: Date,
    default: Date.now
}
});


schema.path('username').validate(function (value, respond) {
  return /[0-9]{6,15}[a-zA-Z]/.test(value, function(){
    respond(false, 'this message gets to the validation error');
});
}, '{VALUE} is not a valid login - [0-9]{6,15}[a-zA-Z]')


schema.methods.encryptPassword = function(password) {
  return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
};

schema.virtual('password')
  .set(function(password) {
      this._plainPassword = password;
      this.salt = Math.random() + '';
      this.hashedPassword = this.encryptPassword(password);
})
.get(function() { return this._plainPassword; });


schema.methods.checkPassword = function(password) {
  return this.encryptPassword(password) === this.hashedPassword;
};

schema.path('username').validate(function (value) {
  return /[0-9]{6,15}[a-zA-Z]/.test(value);
}, 'Invalid color');

exports.User = mongoose.model('User', schema);

You don't need to call anything before saving to vaildate, mongoose will do it for you. 保存为vaildate之前,您无需调用任何内容,猫鼬会为您完成此操作。 Also don't call callback until you are done. 完成操作后也不要调用callback

Also check if error occur before doing console.log(err.message) because err is null if now error happens. 还要在执行console.log(err.message)之前检查是否发生错误,因为如果现在发生errerrnull

So this should work: 所以这应该工作:

} else {
    var user = new User({username: username, password: password});
    user.save(function(err) {
        if (err) {
            console.log(err.message);
            return next(err);
        }
        callback(user);
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM