2017-12-11 4 views
1

エラーが発生しましたValidationError:新しいユーザーを登録しようとすると、passwordのパスが必要です。私は、ノード、プログラミング、および認証の新機能です。NodejsでValidationError:ValidationError:パス `password`が必要です

ここに私が持っているコードがあります、そして、私はそれを撃つのを試みるためにやったことを歩いて行きます。

Userモデルとスキーマ

var mongoose = require("mongoose"); 
var passportLocalMongoose = require("passport-local-mongoose"); 
var bcrypt = require("bcrypt-nodejs"); 

var UserSchema = new mongoose.Schema({ 
    username: {type: String, unique: true, required: true}, 
    password: {type: String, unique: true, required: true}, 
    // avatar: String, 
    firstName: String, 
    lastName: String, 
    email: {type: String, unique: true, required: true}, 
    resetPasswordToken: String, 
    resetPasswordExpires: Date, 
    // isAdmin: {type: Boolean, default: false} 
}); 

UserSchema.plugin(passportLocalMongoose); 

//save function -- hashes and then saves the password 
UserSchema.pre('save', function(next) { 
    var user = this; 
    var SALT_FACTOR = 5; 

    if (!user.isModified('password')) return next(); 

    bcrypt.genSalt(SALT_FACTOR, function(err, salt) { 
    if (err) return next(err); 

    bcrypt.hash(user.password, salt, null, function(err, hash) { 
     if (err) return next(err); 
     user.password = hash; 
     next(); 
    }); 
    }); 
}); 

//compares and checks password 

UserSchema.methods.comparePassword = function(candidatePassword, cb) { 
    bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { 
    if (err) return cb(err); 
    cb(null, isMatch); 
    }); 
}; 

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

は、ここに私のapp.jsファイルされる:

var express = require("express"), 
    app = express(), 
    bodyParser = require("body-parser"), 
    mongoose = require("mongoose"), 
    expressSanitizer = require("express-sanitizer"), 
    passport = require("passport"), 
    cookieParser = require("cookie-parser"), 
    LocalStrategy = require("passport-local"), 
    session = require("express-session"), 
    nodemailer = require("nodemailer"), 
    bcrypt = require("bcrypt-nodejs"), 
    async = require("async"), 
    crypto = require("crypto"), 
    flash = require("connect-flash"), 
    moment = require("moment"), 
    User = require("./models/user"), 
    // seedDB  = require("./seeds"), 
    methodOverride = require("method-override"); 


// APP CONFIG 
mongoose.connect("mongodb://localhost/blog", {useMongoClient: true}); 
//PRODUCTION CONFIG - LIVE URL GOES HERE! 

app.set("view engine", "ejs"); 
app.use(express.static(__dirname + "/assets")); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(expressSanitizer()); 
app.use(methodOverride("_method")); 
app.use(cookieParser('secret')); 
//require moment 
app.locals.moment = require('moment'); 
// seedDB(); //seed test data! 


// PASSPORT CONFIGURATION 
app.use(require("express-session")({ 
    secret: "It's a secret to everyone!!", 
    resave: false, 
    saveUninitialized: false 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 
passport.use(new LocalStrategy(function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
    if (err) return done(err); 
    if (!user) return done(null, false, { message: 'Incorrect username.' }); 
    console.log(user); 
    User.comparePassword(password, function(err, isMatch) { 
     if (isMatch) { 
     return done(null, user); 
     } else { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
    }); 
    }); 
})); 
passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

app.use(function(req, res, next){ 
    res.locals.currentUser = req.user; 
    res.locals.success = req.flash('success'); 
    res.locals.error = req.flash('error'); 
    next(); 
}); 


// REQUIRE ROUTES 
var commentRoutes = require("./routes/comments"), 
    bpostRoutes = require("./routes/bposts"), 
    indexRoutes = require("./routes/index"); 


//USE ROUTES 
app.use("/", indexRoutes); 
app.use("/bposts", bpostRoutes); 
app.use("/bposts/:id/comments", commentRoutes); 


//RUN SERVER 
app.listen(process.env.PORT, process.env.IP, function(){ 
    console.log("The Server Has Started!"); 
}); 

ここでは、新しいユーザー

// handle sign up logic 

router.post("/register", function(req, res) { 

    var newUser = new User({ 
     username: req.sanitize(req.body.username), 
     firstName:req.sanitize(req.body.firstName), 
     lastName: req.sanitize(req.body.lastName), 
     email: req.sanitize(req.body.email), 
    }); 
    console.log(newUser); 

    // if (req.body.adminCode === 'secretcode123') { 
    //  newUser.isAdmin = true; 
    // } 

    User.register(newUser, req.body.password, function(err, user) { 
     if (err) { 
      console.log(err); 
      return res.render("register", { error: err.message }); 
     } 
     passport.authenticate("local")(req, res, function() { 
      req.flash("success", "Successfully Signed Up! Nice to meet you " + req.body.username); 
      res.redirect("/bposts"); 
     }); 
    }); 
}); 

Asを投稿するためのindex.jsルートファイルですあなたはindex.jsに見ることができます

私はconsole.log(newUser)を実行し、newUserオブジェクト全体を返します。私は舞台裏で起こっていただきました見つけるために何ができる他のどのようなテストを確認していない本の外

{ username: 'apple', 
     firstName: 'apple', 
     lastName: 'apple', 
     email: '[email protected]', 
     _id: 5a2eac41720dc60acffa02f4 } 

。私はそれを自分で解決することができますので、この種の問題を将来どのように考えるかについての助けや指針はすばらしいでしょう。ありがとう。

{ ValidationError: User validation failed: password: Path `password` is required. 
    at MongooseError.ValidationError.inspect (/home/ubuntu/workspace/node_modules/mongoose/lib/error/validation.js:57:23) 
    at formatValue (util.js:351:36) 
    at inspect (util.js:185:10) 
    at exports.format (util.js:71:24) 
    at Console.log (console.js:43:37) 
    at /home/ubuntu/workspace/routes/index.js:35:21 
    at /home/ubuntu/workspace/node_modules/passport-local-mongoose/index.js:213:33 
    at /home/ubuntu/workspace/node_modules/mongoose/lib/model.js:4038:16 
    at /home/ubuntu/workspace/node_modules/mongoose/lib/services/model/applyHooks.js:175:17 
    at _combinedTickCallback (internal/process/next_tick.js:73:7) 
    at process._tickCallback (internal/process/next_tick.js:104:9) 
    errors: 
    { password: 
     { ValidatorError: Path `password` is required. 
      at MongooseError.ValidatorError (/home/ubuntu/workspace/node_modules/mongoose/lib/error/validator.js:25:11) 
      at validate (/home/ubuntu/workspace/node_modules/mongoose/lib/schematype.js:782:13) 
      at /home/ubuntu/workspace/node_modules/mongoose/lib/schematype.js:829:11 
      at Array.forEach (native) 
      at SchemaString.SchemaType.doValidate (/home/ubuntu/workspace/node_modules/mongoose/lib/schematype.js:789:19) 
      at /home/ubuntu/workspace/node_modules/mongoose/lib/document.js:1528:9 
      at _combinedTickCallback (internal/process/next_tick.js:73:7) 
      at process._tickCallback (internal/process/next_tick.js:104:9) 
     message: 'Path `password` is required.', 
     name: 'ValidatorError', 
     properties: [Object], 
     kind: 'required', 
     path: 'password', 
     value: undefined, 
     reason: undefined, 
     '$isValidatorError': true } }, 
    _message: 'User validation failed', 
    name: 'ValidationError' } 

答えて

1

は基本的にあなたがあなたのモデルにパスワードが必要であることを定義した:それは場合に役立ちます。ここ

も同様にいっぱいのStackTraceです。

var UserSchema = new mongoose.Schema({ 
    username: {type: String, unique: true, required: true}, 
    password: {type: String, unique: true, required: true}, // <-- See here 
    firstName: String, 
    lastName: String, 
    email: {type: String, unique: true, required: true}, 
    resetPasswordToken: String, 
    resetPasswordExpires: Date 
}); 

しかし、あなたは、あなたがそれにパスワードを渡していない保存されている場合:

var newUser = new User({ 
    username: req.sanitize(req.body.username), 
    firstName:req.sanitize(req.body.firstName), 
    lastName: req.sanitize(req.body.lastName), 
    email: req.sanitize(req.body.email), 
    /* password: req.sanitize(req.body.password) // <- Probably missing something like this.*/ 
}); 

は、私は次のブログを書いていないが、私はそれがあなたのために役立つかもしれないと思います。

https://github.com/DDCreationStudios/Writing/blob/master/articles/AuthenticationIntro.md#user-registration

関連する問題