错误:req#注销需要回调函数



无法找到解决这个问题的办法,我只是新的使用护照。错误:req#注销需要回调函数我以前写过代码,但那次我没有收到任何错误,但这次不知道为什么我得到这个,我也读了护照文件,并尝试了每一个解决方案

thanks in advance

<%- include('partials/header') %>
<header>
<nav class="flex align-item-center">
<div class="div-left">
<img id="userimg" src="img/user.png" alt="logo">
</div>
<div class="div-right flex">
<div style="font-size: 14px">
<a href="/logout" role="button"> Logout</a>
</div>
</div>
</nav>
</header>
<%- include('partials/footer') %>

js代码
require('dotenv').config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require('express-session');
const passport = require('passport');
const passportLocalMongoose = require('passport-local-mongoose');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const findOrCreate = require('mongoose-findorcreate');
const app = express();
app.use(express.static("public"));
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(session({
secret: process.env.SECRET,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("#DB")
const accountsdata = new mongoose.Schema({
email: String,
password: String,
googleId: String,
facebookId: String,
combo: String,
date: String,
price: String,
accountemail: String
});
accountsdata.plugin(passportLocalMongoose);
accountsdata.plugin(findOrCreate);
const data = new mongoose.model("amazonprime", accountsdata);
passport.use(data.createStrategy());
passport.serializeUser(function (user, cb) {
process.nextTick(function () {
cb(null, { id: user.id, username: user.username });
});
});
passport.deserializeUser(function (user, cb) {
process.nextTick(function () {
return cb(null, user);
});
});
passport.use(new GoogleStrategy({
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/google/home",
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
},
function (accessToken, refreshToken, profile, cb) {
console.log(profile)
data.findOrCreate({ googleId: profile.id }, function (err, user) {
return cb(err, user);
});
}
));
app.get("/", (req, res) => {
res.render("login");
});
app.get('/auth/google',
passport.authenticate("google", { scope: ["profile"] })
);
app.get("/auth/google/home",
passport.authenticate("google", { failureRedirect: "/" }),
function (req, res) {
res.redirect("/home");
});
app.get("/signup", (req, res) => {
res.render("signup");
});
app.get("/home", function (req, res) {
if (req.isAuthenticated()) {
res.render("home");
} else {
res.redirect("/");
}
})
app.get("/logout", (req, res) => {
req.logout();
res.redirect("/");
});

app.post("/signup", (req, res) => {
data.register({ username: req.body.username }, req.body.password, function (err, user) {
if (err) {
console.log(err);
res.redirect("/signup");
} else {
passport.authenticate("local")(req, res, function () {
res.redirect("/home");
})
}
})
})
app.post("/", function (req, res) {
const user = new data({
username: req.body.username,
password: req.body.password
})
req.login(user, function (err) {
if (err) {
console.log(err);
} else {
passport.authenticate("local")(req, res, function () {
res.redirect("/home")
})
}
})
});
app.get("/logout", (req, res) => {
req.logout();
res.redirect("/");
});


app.listen(3000, function () {
console.log("Server started on port 3000.");
});

错误
Error: req#logout requires a callback function
at IncomingMessage.req.logout.req.logOut (E:Web DevelopmentData Handlernode_modulespassportlibhttprequest.js:65:44)
at E:Web DevelopmentData Handlerapp.js:105:9
at Layer.handle [as handle_request] (E:Web DevelopmentData Handlernode_modulesexpresslibrouterlayer.js:95:5)
at next (E:Web DevelopmentData Handlernode_modulesexpresslibrouterroute.js:144:13)
at Route.dispatch (E:Web DevelopmentData Handlernode_modulesexpresslibrouterroute.js:114:3)
at Layer.handle [as handle_request] (E:Web DevelopmentData Handlernode_modulesexpresslibrouterlayer.js:95:5)
at E:Web DevelopmentData Handlernode_modulesexpresslibrouterindex.js:284:15
at Function.process_params (E:Web DevelopmentData Handlernode_modulesexpresslibrouterindex.js:346:12)
at next (E:Web DevelopmentData Handlernode_modulesexpresslibrouterindex.js:280:10)
at SessionStrategy.strategy.pass (E:Web DevelopmentData Handlernode_modulespassportlibmiddlewareauthenticate.js:346:9)

从0.6.0版本开始(写这篇文章的时候是几天前发布的),req.logout是异步的。这是避免会话固定攻击的更大变化的一部分。

参见发布公告:

另一个主要的变化是req.logout()现在是一个异步函数,而之前它是同步的。例如,以前的注销路由为:

app.post('/logout', function(req, res, next) {
req.logout();
res.redirect('/');
});

应该修改为:

app.post('/logout', function(req, res, next) {
req.logout(function(err) {
if (err) { return next(err); }
res.redirect('/');
});
});

Jared Hanson提到文档还没有更新:

为了提高注销期间会话管理的安全性,这是必要的。升级到0.6.0将需要应用程序向req#logout传递回调。我还在更新文档和示例。

这里的学习者(也是吗?)——我也有同样的问题。我的头撞在墙上,直到教练提到req.login()需要一个回调函数。对于回调,他使用了一个错误处理函数,结果对req.logout()也很有效。

也许你可以试试这个:

app.get("/logout", (req, res) => {
req.logout(req.user, err => {
if(err) return next(err);
res.redirect("/");
});
});

我在官方护照中找到了这个代码,它对我有效,我希望它也能解决你的问题Passport在请求时公开了一个logout()函数

app.get('/logout', function(req, res, next){
req.logout(function(err) {
if (err) { return next(err); }
res.redirect('/');
});
});

如果你正在跟随Angela Yu web开发训练营,那么使用这个,

app.get('/logout', function(req, res, next) {
req.logout(function(err) {
if (err) { 
return next(err); 
}
res.redirect('/');
});
});

这对我来说是完美的:

app.get("/logout", function(req, res, next) {
req.logout(function(err) {
if (err) { return next(err); }
res.redirect("/");
});
});

你也可以这样写:

app.post("/logout", function(req, res, next) {
req.logout(function(err) {
if (err) { return next(err); }
res.redirect("/");
});
});

都可以,干杯!!

如果这是与Angela Yu训练营。使用:

https://www.passportjs.org/tutorials/password/logout/

app.get("/logout", function(req,res,next){
req.logout(function(err){
if (err)
{
return next(err);
}
res.redirect("/");
});
});
app.get('/users/logout', (req, res, next) => {
req.logout(function (err) {
if (err) {
return next(err);
}
// if you're using express-flash
req.flash('success_msg', 'session terminated');
res.redirect('/login');
});
});

这是我的问题,不工作:

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

解决方案为:

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const app = express();
app.use(express.static("public"));
app.use(bodyParser.urlencoded({
extended: true
}));
app.set("view engine", "ejs");
app.use(
session({
secret: "our little secret.",
resave: false,
saveUninitialized: false,
})
);
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://127.0.0.1/userDB");
const userSchema = new mongoose.Schema({
email: String,
password: String,
});
userSchema.plugin(passportLocalMongoose);
const User = new mongoose.model("User", userSchema);
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.get("/", (req, res) => {
res.render("home");
});
app.get("/login", (req, res) => {
res.render("login");
});
app.get("/register", (req, res) => {
res.render("register");
});
app.get("/secrets", (req, res) => {
if (req.isAuthenticated()) {
res.render("secrets");
} else {
res.redirect("/login");
}
});
app.get("/logout", function(req, res, next) {
req.logout(function(err) {
if (err) {
return next(err);
}
res.redirect("/");
});
});
<nav class="grey darken-3">
<div class="nav-wrapper container">
<a href="#!" class="brand-logo center">StoryBooks</a>
<a href="#" data-target="mobile-demo" class="sidenav-trigger show-on-large"><i class="fas fa-bars"></i></a>
<ul class="sidenav" id="mobile-demo">
<li><a href="/stories">Public Stories</a></li>
<li><a href="/dashboard">Dashboard</a></li>
<li><a href="/auth/logout">Logout</a></li>
</ul>
</div>
</nav>
app.get("/logout", function(req, res, next) {
req.logout(function(err) {
if (err) {
return next(err);
}
res.redirect("/");
});
});

这对我有用!

最新更新