首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValidationError:在MongooseError.ValidationError处用户验证失败

ValidationError:在MongooseError.ValidationError处用户验证失败
EN

Stack Overflow用户
提问于 2016-10-07 09:58:12
回答 1查看 16.1K关注 0票数 7

我正在尝试创建一个简单的node.js应用程序,使用mongoDb和express作为框架进行passport本地身份验证,但是我遇到了一个问题

每当我尝试使用注册表将数据提交到数据库中时,单击提交后,它会立即出现在节点终端中:

下面是我的用户模式:

代码语言:javascript
复制
    var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');

// define the schema for our user model
var userSchema = mongoose.Schema({

    local            : {
        name    : String,
        username     : String,
        mobile       : Number,
        email        : String,
        gender       : String,
        password     : String

    }
});

// methods ======================
// generating a hash
userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// checking if password is valid
userSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password);
};

// create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);

和我的路由器文件:

代码语言:javascript
复制
 // process the signup form
    app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/profile', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

注册逻辑的passport配置:

代码语言:javascript
复制
    passport.use('local-signup', new LocalStrategy({

    nameField     : 'name',    
    usernameField : 'username',
    mobileField   : 'mobile',
    emailField    : 'email',
    genderField   : 'gender',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, name, username, mobile, email, gender, password, done) {

    // asynchronous
    // User.findOne wont fire unless data is sent back
    process.nextTick(function() {

    // find a user whose email is the same as the forms email
    // we are checking to see if the user trying to login already exists
    User.findOne({ 'local.email' :  email }, function(err, user) {
        // if there are any errors, return the error
        if (err)
            return done(err);


        // check to see if theres already a user with that email
        if (user) {
            return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
        } else {

            // if there is no user with that email
            // create the user
            var newUser            = new User();

            // set the user's local credentials
            newUser.local.name     = name;
            newUser.local.username = username;
            newUser.local.mobile   = mobile;
            newUser.local.email    = email;
            newUser.local.gender   = gender;
            newUser.local.password = newUser.generateHash(password);

            // save the user
            newUser.save(function(err) {
                if (err)
                    throw err;

                return done(null, newUser);
            });
        }

    });

    });

}));

我对node.js和mongoDb都是新手,请帮帮我

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 11:25:50

原因:此错误背后的原因是存储在数据库中的类型无效。比如mobile是number类型,但是如果你传递的值不能被转换成number,那么它也会给出同样的错误。

console.log(newUser);在保存用户并检查传入的值之前,移动字段可以转换为Number,因为它的数据类型在模式中是number。

如果移动端是"“或未定义的或空的,即不能转换为数字,那么它将无法工作。如果它的值不存在,则从对象中删除该键。不要传递未定义的、null或"“或字符串(不能转换为数字)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39908206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档