【问题标题】:Passport Session Failed to serialize (Bad Gateway)Passport 会话序列化失败(网关错误)
【发布时间】:2021-08-26 15:53:39
【问题描述】:

我正在使用以下依赖项:

  1. 快速会话
  2. 护照
  3. 本地护照
  4. 护照本地猫鼬

当我尝试注册用户并且他们发布数据时。数据被保存到数据库中,但它给出了一个错误的请求。另外,当我尝试在Tweet.find() 中使用req.user.id 时,它给出了未定义的结果,而我也给出了console.log(req.user),它给了我未定义的结果。一旦出现错误,无法序列化会话一两次。有谁能够帮我。这是一些代码,如果代码太多,请提前抱歉,因为我不确定代码的哪一部分很重要。

//-----------------------//Require---------------------
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const ejs = require("ejs");
const session = require("express-session");
const passport = require("passport");
const LocalStratagy= require("passport-local").Strategy;
const passportLocalMongoose = require("passport-local-mongoose");
const mongoose = require("mongoose");

//-----------------------//App.use---------------------

app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: false
}));
//-----------------------//Passport---------------------

app.use(passport.initialize());
app.use(passport.session());


//-----------------------//Mongoose---------------------
mongoose.connect('mongodb://localhost/Twitter', {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.set('useCreateIndex', true);
const tweetschema = new mongoose.Schema({
    username: String,
    password: String,
    tweets: String
});
//-----------------------//Schema Plgin---------------------

tweetschema.plugin(passportLocalMongoose);

//-----------------------//New Model---------------------

const Tweet = new mongoose.model("Tweet", tweetschema);

//-----------------------//Local Strategy-------------------
passport.use(new LocalStratagy(Tweet.authenticate()));

//-----------------------//Seralize Passport---------------------

passport.serializeUser(function(user, done) {
    console.log(user);
    done(null, user.id);
});

//-----------------------//Desarlize Passport---------------------
passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

app.post("/tweets", bodyParser.urlencoded({extended: true}), (req, res)=>{
    const Gottweets= req.body.tweet;
    console.log(Gottweets);
    console.log(req.user);
   /*  Tweet.findById(req.tweet.id, (err, foundUser)=>{
        if(err){
            console.log(err);
            res.redirect("/tweets");
        }else{
            if(foundUser){
                foundUser.tweets = Gottweets;
                foundUser.save(()=>{
                    res.redirect("/");
                })
            }
            
        }
        
    })
     */
    


});

app.post("/regsiter",bodyParser.urlencoded({extended: true}), (req, res)=>{
    console.log(req.body.email);
    Tweet.register({username: req.body.email}, req.body.password, (err, user)=>{
        if(err){
            console.log(err);
            res.redirect("/regsiter");
        }else{
            if(user){
                passport.authenticate("local")(req, res, function(){
                    res.redirect("/regsiter");
                })
            }
        }
    })
});
<%- include('partials/header') %>
<form action="/regsiter" method="post" class="login">
    <label for="emial" class="email">
        Email
        <input type="email" name="email" id="email">
    </label>
    <label for="password">
        Password
        <input type="password" name="password" id="password">
    </label>
    <div class="soicalLogin">
        <a href="#" class="facebook">Facebook</a>
        <a href="#" class="google">Google</a>

    </div>
    
    <button type="submit">Register</button>
    

</form>

<%- include('partials/footer') %>

【问题讨论】:

    标签: javascript node.js express passport.js express-session


    【解决方案1】:

    您可以尝试使用此示例重写您的 POST /register 端点

    app.post("/register",bodyParser.urlencoded({extended: true}), (req, res, next) => {
        console.log(req.body.email);
        Tweet.register({username: req.body.email}, req.body.password, (err, user)=>{
            if(err){
                console.log(err);
                res.redirect("/regsiter");
                return;
            }
            if(!user){ // also handle the case where user is undefined
                return res.status(500).json({ yourMessage: 'error' });
            }
            next();
        })
    }, passport.authenticate("local", { successRedirect: '/', failureRedirect: '/register' }));
    

    重写赋予passport.authenticate("local")next 函数不是一个好主意

    现在错误应该消失了,如果此代码示例不起作用,请告诉我。

    希望对你有帮助

    【讨论】:

    • 坏网关消失了,但它重定向到故障路由你能帮我解决这个问题吗?req.user 仍然未定义会话没有序列化,我认为 cookie 没有被创建。跨度>
    • 对于 passport.use(new LocalStratagy(...)) 确保您编写的代码符合官方文档github.com/jaredhanson/passport-local
    猜你喜欢
    • 2018-06-03
    • 2014-12-12
    • 2017-11-05
    • 2018-07-23
    • 2017-09-02
    • 2022-08-02
    • 2017-10-15
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多