无法读取 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:无法将用户序列化到会话中(已经添加了序列化代码)?

无法使用 Passport.js 和 Express 4 访问 req.user

passport.js 中的 Date.now 无法完成

Passport js 无法跨域维护会话

如何正确使用 Passport.js?

Passport.js 异步与同步反序列化