Javascript Node.js-不是一个函数
我正在Node.js中编写一个登录名。它过去工作得很好,但现在我试图添加一个字段,但它停止了工作,我不知道为什么。我正在使用Passport.js进行身份验证 奇怪的是,它确实会将用户添加到数据库中,但会切换字段。姓名、密码等 我得到的错误如下 C:\Users***\Documents\GitHub\Query\config\passport.js:33 返回完成(null、false、req.flash('signupMessage','Je email bestaat al'); ^ TypeError:done不是一个函数 在询问时。(C:\Users***\Documents\GitHub\Query\config\passport.js:33:28) passport.jsJavascript Node.js-不是一个函数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在Node.js中编写一个登录名。它过去工作得很好,但现在我试图添加一个字段,但它停止了工作,我不知道为什么。我正在使用Passport.js进行身份验证 奇怪的是,它确实会将用户添加到数据库中,但会切换字段。姓名、密码等 我得到的错误如下 C:\Users***\Documents\GitHub\Query\config\passport.js:33 返回完成(null、false、req.flash('signupMessage','Je email bestaat al'); ^ Ty
var LocalStrategy = require('passport-local').Strategy;
var FacebookStrategy = require('passport-facebook').Strategy;
var User = require('../models/login.js');
var configAuth = require('./auth');
module.exports = function (passport) {
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
passport.use('local-signup', new LocalStrategy({
nameField: 'name',
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function (req, name, email, password, done) {
User.findOne({
'local.email': email
}, function (err, user) {
if (err)
return done(err);
if (user) {
return done(null, false, req.flash('signupMessage', 'Je email bestaat al.'));
} else {
var newUser = new User();
newUser.local.name = name;
newUser.local.email = email;
newUser.local.password = newUser.generateHash(password);
newUser.save(function (err) {
if (err)
throw err;
return done(null, newUser);
});
}
});
}));
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function (req, name, email, password, done) {
User.findOne({
'local.email': email
}, function (err, user) {
if (err)
return done(err);
if (!user)
return done(null, false, req.flash('loginMessage', 'De gebruiker bestaat niet. Maak een account!'));
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Wachtwoord is verkeerd. Probeer het opnieuw!'));
return done(null, user);
});
}));
登录模型
var mongoose = require('mongoose'); var bcrypt = require('bcrypt-nodejs');
var userSchema = mongoose.Schema({
local : {
name : String,
email : String,
password : String,
},
facebook : {
id : String,
token : String,
email : String,
name : String
} });
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); };
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.local.password); };
module.exports = mongoose.model('User', userSchema);
路线
module.exports = function (app, passport) {
app.get('/', function (req, res) {
res.render('login.ejs', {
message: req.flash('loginMessage')
});
});
app.get('/register', function (req, res) {
res.render('index.ejs', {
message: req.flash('signupMessage')
});
});
app.post('/', passport.authenticate('local-login', {
successRedirect: '/topic',
failureRedirect: '/',
failureFlash: true
}));
app.post('/register', passport.authenticate('local-signup', {
successRedirect: '/topic',
failureRedirect: '/register',
failureFlash: true
}));
};
构成视图的一部分
<form action="/register" method="post">
<div class="form-group">
<input type="text" placeholder="Name" class="form-control nameForm" name="name">
</div>
<!-- END FORM GROUP -->
<div class="form-group">
<input type="text" placeholder="Email" class="form-control emailForm" name="email">
</div>
<!-- END FORM GROUP -->
<div class="form-group">
<input type="password" placeholder="Password" class="form-control" name="password">
</div>
<!-- END FORM GRROUP -->
<button type="submit" class="btn btn-primary btn-default">Registeer</button>
</form>
登记员
本地策略的验证回调签名不正确:
passport.use('local-signup', new LocalStrategy({
nameField: 'name',
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, function (req, name, email, password, done) { ... })
正确的签名:
function(req, email, password, done) { ... }
(无name
参数)
这也解释了为什么字段似乎发生了移位。ReferenceError:第38行没有定义名称。它使用newUser.local.name=name中的name变量;行。LocalStrategy
使用两个字段:username
和password
。您可以选择使用电子邮件地址而不是用户名,这是您所做的,但不能同时使用这两个地址。所以你必须解决这个问题;由于您正在传入req
,您可能可以使用req.body.name
来代替。我尝试使用用户名和密码进行身份验证,但我在视图中添加了一个额外字段,以便用户可以填写他们的姓名。这样我就可以在loggedin页面上显示名称。所以我只是在尝试向数据库中添加额外的字段。护照不可能吗?如果没有,我可以显示电子邮件。对于Passport的LocalStrategy,您只能定义两个用于登录的字段,因此您需要选择是e-mail/password
还是username/password
。您在策略选项中定义的字段。但是,在将新用户保存到数据库时,您可以通过req.body
访问表单中的任何其他字段。