无法读取 null + passport.js 的属性“正文”
Posted
技术标签:
【中文标题】无法读取 null + passport.js 的属性“正文”【英文标题】:Cannot read property 'body' of null + passport.js 【发布时间】: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 检查,因此我省略了该文件,但如果你们中的任何人认为这对解决此问题有用,我会将其作为编辑提供。
【问题讨论】:
【参考方案1】:请在您的app.js
中试试这个:
app.post('/signup', passport.authenticate('local'), function(req, res, next, err)
//^ close
// If this function gets called, authentication was successful.
res.redirect('/users/' + req.user.username);
);
如果您需要自定义回调:
app.post('/signup', function(req, res, next)
passport.authenticate('local', function(err, user, info)
//Your code here
)(req, res, next);
);
详情请咨询http://passportjs.org/docs/authenticate。
【讨论】:
当我实现你的第一个代码 sn-p 时,我被重定向到 BAD REQUEST,当我使用 app.post('/signup', function(req, res, next) 进行自定义回调时 passport.authenticate('local', function(err, user, info) console.log(info); if (err) console.log(err); res.json(req.body); )(请求, 资源, 下一个) );我被重定向到一个完全空白的页面,没有错误输出 尝试将res.json(req.body)
替换为res.json(message:"success")
以确保!
我不知道你的目的是什么,但一般来说,当用户未经身份验证时,你必须重定向他!
对 res.json(message:"success") 的更改显示在自定义回调中。我更大的目标是让用户重定向一个包含他们信息的个人资料页面,但我认为我仍然可能会遇到问题,因为 req.body 在身份验证成功后似乎为空
我认为你需要 req.user
而不是 req.body
!请看答案,我已经更新了第一个sn-p!以上是关于无法读取 null + passport.js 的属性“正文”的主要内容,如果未能解决你的问题,请参考以下文章
Passport.js:无法将用户序列化到会话中(已经添加了序列化代码)?