TypeError: req.logIn 不是一个函数 - Passport JS



我很确定这不是一个错误,因为谷歌搜索它没有发现任何东西。

我正在使用护照JS和本地策略。在我的登录路由上,我使用自定义回调并在确定用户存在后调用 req.login,因为文档说:

请注意,使用自定义时 回调,应用程序负责建立 会话(通过调用 req.login(((并发送响应

但是,它一直说reg.logIn是未定义的(请注意,您可以调用reg.login或req.logIn,因为它们是别名。我也都试过了(。我的 IDE 正在获取打字稿定义,我可以看到在编译的应用程序.js文件的输出中定义的 req.logIn 函数,所以我不确定为什么会收到此错误。

应用程序

const localStrategy = LocalStrategy.Strategy;
passport.use(new localStrategy({
usernameField: 'email',
passwordField: 'password'
},
async function (email, password, done) {
const member: IMember | null = await MemberModel.findOne({where: {email: email}});
if (member) {
bcrypt.compare(password, member.hash, function (err, res) {
if (err) return done(null, false, {message: err.message});
if (!res) {
return done(null, false, {message: 'Incorrect password.'});
} else {
return done(null, member);
}
});
}
else {
return done(null, false, {message: 'Couldn't find a matching user.'});
}
}
));
passport.serializeUser(function(user: IMember, done) {
done(null, user.id);
});
passport.deserializeUser(async function(id: string[], done) {
const user: IMember | null = await MemberModel.findOne({where: {id: id}});
if (user) {
done(null, user);
}
});
// Initialize the app
const app: e.Express = express();
app.use(bodyParser.json());
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.post('/login', (req, res, next) => {
passport.authenticate('local', (err, user, options) => {
if (err) {
return next(err);
}
if (!user) {
return next(options.message);
}
req.logIn(user, ((err) => { // <-- Errors on this line 
if (err) {
return next(err); }
return res.redirect('/users/' + user.username);
}));
})(req, res, next);
});

版本


"express": "^4.17.1",
"express-session": "^1.17.0",
"passport": "^0.4.1",
"passport-local": "^1.0.0",
"typescript": "^3.7.4",
"@types/express-session": "^1.15.16",
"@types/passport": "^1.0.2",
"@types/passport-local": "^1.0.33",
"@types/express": "^4.17.2",

您需要在路线注册之前启动护照中间件:

app.use(passport.initialize());
req.logIn(user, ((err) => { // <-- Errors on this line 
if (err) {
return next(err); }
return res.redirect('/users/' + user.username);
}));

尝试req.login没有驼峰案例,如上所示 http://www.passportjs.org/docs/login/

此错误是由于初始化 app.use(passport.initialize(((; 使用routes routes app.use("/api",initWebRoutes(之后;所以我们应该在所有调用路由之前启动护照中间件。

最新更新