node.js - req.logout() 不是一个函数

标签 node.js express passport.js logout

我已经尝试寻找解决方案一段时间了,但我对编程仍然很陌生。我发现这篇关于类似问题的文章,但没有任何评论或解决方案对我有用,引用:
https://stackoverflow.com/questions/45541182/passport-req-logout-function-not-working
还有这个:Why is PassportJS in Node not removing session on logout

这是我的 HTML 和 JS 代码:

<!DOCTYPE html>

<html>
    <head>
        <meta charset="utf-8">
        <title>Success!</title>
        <link rel="stylesheet" href="css/styles.css">
        <!-- Google Fonts -->
        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
    </head>
    <body>
        <h1>Success!</h1>
            <form action="/success" method="post">
                <button type="submit"></button>
            </form>
    </body>
</html>

---------------------------------------------------------------------------------------------

JS CODE HERE:

---------------------------------------------------------------------------------------------

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");

const app = express();

app.set("view engine", "ejs");

const session = require("express-session");



app.use(session({
    resave:false,
    saveUninitialized: true,
    secret: (hush)
}));

app.use(express.static("public"));

app.use(bodyParser.urlencoded({
    extended: true
}));


app.get("/", (req, res) => {
    res.redirect("/login");
});

app.get("/login", (req, res) => {
    res.sendFile(__dirname + "/public/login.html")
})

app.get("/success", function(req, res) {
    res.sendFile(__dirname + "/public/success.html")
})


app.get('/logout', (req, res) => {
    req.logout();
    req.session.destroy(()=>{
      res.redirect('/');
    });
  });
app.post("/success", function(req, res) {
    console.log("Deleting");
    
    res.redirect("/logout");
})


const passport = require("passport");
const res = require("express/lib/response");
var userProfile;


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

app.get("/success", function(req, res) {
if (req.user) {
    res.send(userProfile);
} else {
    res.redirect("/login")
}});

app.get("/error", (req, res) => res.send("error logging in"));

passport.serializeUser(function(user, cb) {
    cb(null, user)
});

passport.deserializeUser(function(obj, cb) {
    cb(null, obj)
});
const GoogleStrategy = require("passport-google-oauth").OAuth2Strategy;
const GOOGLE_CLIENT_ID = process.env.CLIENT_ID;
const GOOGLE_CLIENT_SECRET = process.env.CLIENT_SECRET;

passport.use(new GoogleStrategy({
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "https://tverrfaglig.herokuapp.com/auth/google/callback"
},
function(accessToken, refreshToken, profile, done) {
    userProfile=profile;
    return done (null, userProfile);
}
));

app.get("/auth/google",
    passport.authenticate("google", { scope : ["profile", "email"] }));

app.get('/auth/google/callback', 
    passport.authenticate('google', {
        successRedirect: '/success',
        failureRedirect: '/login'
    })
);


app.listen(process.env.PORT || "3000", function() {
    console.log("Server started!");
});




提前致谢!

最佳答案

您应该在调用注销函数之前配置通行证。

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

应该在上述代码之后调用注销

引用 - https://codedec.com/tutorials/logout-using-passport-module-in-node-js/

关于node.js - req.logout() 不是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72002750/

相关文章:

Node.js - 限制我发出的请求数量

javascript - 运行 AGStoShapefile.js 时出错

javascript - Node.JS 连接计数器

javascript - 无法读取未定义的属性“id”

jQuery.ajax 发送 OPTIONS 和 POST,如何使用 Express.js (Node.js) 处理

javascript - Nodejs Passport - 使用多个谷歌策略

node.js - csrf token 使用

javascript - 类型错误 : Cannot read properties of undefined (reading 'prototype' ) React Typescript + Express

Node.JS 验证 Google 身份验证 token

使用 Sails.JS 框架的 Node.JS -- Passport : no strategy registered under name: facebook