【问题标题】:Cannot read property 'body' of null + passport.js无法读取 null + passport.js 的属性“正文”
【发布时间】:2016-11-27 12:08:59
【问题描述】:

我正在尝试在 Node/Express/Sequelize 应用程序中实现 passport.js。我试图尽可能忠实于the official documentationScotch.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


    【解决方案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!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多