MongoDbを使用してパスポートローカル認証を使用して単純なnode.jsアプリを作成し、フレームワークとして表現しようとしていますが、問題が発生しています
登録フォームを使用してデータベースにデータを送信しようとすると、送信をクリックするとすぐにノードターミナルに表示されます:
これが私のユーザースキーマがどのように見えるかです:
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);
と私のルーターファイル:
// 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.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を初めて使用しますので、手伝ってください
ありがとう
理由:このエラーの背後にある理由は、dbに格納するタイプが無効です。モバイルは数値型ですが、数値に変換できない値を渡すと、同じエラーが発生します。
console.log(newUser);ユーザーを保存し、モバイルフィールドに渡す値がNumberに変換可能であることを確認する前に、そのデータ型はスキーマ内の数値です。
モバイルが「」または未定義またはnullの場合、つまり数値に変換できない場合、モバイルは機能しません。値が存在しない場合は、このキーをオブジェクトから削除します。 undefined、null、 ""、または文字列(数値に変換できない)を渡さないでください。