无法找到解决这个问题的办法,尝试了一切,我只是新的使用护照。错误:req #logout需要一个回调函数我以前编写过这个代码,但那次我没有收到任何错误,但这次不知道为什么我会收到这个,我也读过passport文档,并尝试了每一个解决方案
先谢了
<%- 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 Development\Data Handler\node_modules\passport\lib\http\request.js:65:44)
at E:\Web Development\Data Handler\app.js:105:9
at Layer.handle [as handle_request] (E:\Web Development\Data Handler\node_modules\express\lib\router\layer.js:95:5)
at next (E:\Web Development\Data Handler\node_modules\express\lib\router\route.js:144:13)
at Route.dispatch (E:\Web Development\Data Handler\node_modules\express\lib\router\route.js:114:3)
at Layer.handle [as handle_request] (E:\Web Development\Data Handler\node_modules\express\lib\router\layer.js:95:5)
at E:\Web Development\Data Handler\node_modules\express\lib\router\index.js:284:15
at Function.process_params (E:\Web Development\Data Handler\node_modules\express\lib\router\index.js:346:12)
at next (E:\Web Development\Data Handler\node_modules\express\lib\router\index.js:280:10)
at SessionStrategy.strategy.pass (E:\Web Development\Data Handler\node_modules\passport\lib\middleware\authenticate.js:346:9)
8条答案
按热度按时间lh80um4z1#
从0.6.0版本开始(写这篇文章的时候几天前才发布),
req.logout
是异步的,这是避免会话固定攻击的更大变化的一部分。请参见release announcement:
另一个主要变化是
req.logout()
现在是异步函数,而以前是同步的。例如,以前的注销路径是:应改为:
Jared Hanson提到,这些文档尚未更新:
为了提高注销时会话管理的安全性,这是必要的。升级到0.6.0将需要应用程序传递回调到
req#logout
。我还在更新文档和示例。lsmepo6l2#
这里的学员(也是?)--我也遇到过同样的问题。我的头一直撞到墙上,直到讲师提到
req.login()
需要一个回调函数。对于回调,他使用了一个错误处理函数,结果证明该函数也适用于req.logout()
。也许你可以试试这个:
5n0oy7gb3#
如果你正在关注Angela Yu网络开发训练营,那么使用这个,
ukdjmx9f4#
zbq4xfa05#
这是我的问题,是行不通的:
解决方案是:
bz4sfanl6#
这对我来说非常有效:
你也可以用这个
两个都行,干杯!!!
5ssjco0h7#
如果这是安吉拉·于训练营,用这个:
https://www.passportjs.org/tutorials/password/logout/
yqyhoc1h8#