【发布时间】:2016-11-27 12:08:59
【问题描述】:
我正在尝试在 Node/Express/Sequelize 应用程序中实现 passport.js。我试图尽可能忠实于the official documentation 和Scotch.io tutorial,目前我的脚手架中有以下相关代码段:
app.js
const express = require('express');
const http = require('http');
const https = require('https');
const sequelize = require('sequelize');
const db = require('./config/sequelize');
const config = require('./config/config');
const passport = require('./config/passport');
const app = express();
const port = 3000;
app.use(passport.initialize());
app.use(passport.session());
app.set('view engine', 'ejs');
app.listen(port);
app.post('/signup', passport.authenticate('local', function(req, res, next, err){
if (err) { console.log(err); }
res.json(req.body);
}));
./config/passport.js
const db = require('./sequelize');
const passport = require('passport'),
LocalStrategy = require('passport-local').Strategy;
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(user, done) {
db.User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use('local', new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
},
function(email, password, done){
process.nextTick(function() {
db.User.findOne({ email : 'local.email' }, function(err, user) {
if (err)
return done(err);
if (user) {
return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
}
else {
db.User.create({
username: 'local.email',
password: 'local.password'
});
}
});
});
}
));
module.exports = passport;
./views/signup.ejs
<!-- LOGIN FORM -->
<form action="/signup" method="post">
<div class="form-group">
<label>Email</label>
<input type="text" name="username">
</div>
<div class="form-group">
<label>Password</label>
<input type="password" name="password">
</div>
<button type="submit">Signup</button>
</form>
有了这个实现,我启动应用程序,输入电子邮件地址和密码以在 ./views/signup.ejs 上注册,然后收到以下错误:
TypeError: Cannot read property 'body' of null
at C:\Users\Adam\Desktop\repos\chinese-democracy\app.js:45:15
at allFailed (C:\Users\Adam\Desktop\repos\chinese-democracy\node_modules\passport\lib\middleware\authenticate.js:94:18)
at attempt (C:\Users\Adam\Desktop\repos\chinese-democracy\node_modules\passport\lib\middleware\authenticate.js:167:28)
...
这表明 req.body 被返回为 null,我怀疑它与 deserializeUser 和 serializeUser 函数在 ./config/passport.js 中定义的方式有关,但我怎样才能得到详细的错误输出以确定确切的原因是什么?此外,我已经对我的 Sequelize 数据库进行了健全的 CRUD 检查,因此我省略了该文件,但如果你们中的任何人认为这对解决此问题有用,我会将其作为编辑提供。
【问题讨论】:
标签: javascript node.js express passport.js sequelize.js