我很确定这不是一个错误,因为谷歌搜索没有发现任何结果。
我正在使用 Passport JS 和本地策略。在我的登录路线上,我使用自定义回调,并在确定用户存在后调用 req.login,因为文档显示:
请注意,当使用自定义
回调,应用程序有责任建立一个
会话(通过调用 req.login())并发送响应
但是,它一直说 reg.logIn 未定义(请注意,您可以调用 reg.login 或 req.logIn,因为它们是别名。我也尝试过两者)。我的 IDE 正在获取打字稿定义,我可以看到编译后的 app.js 文件的输出中定义的 req.logIn 函数,所以我不确定为什么会收到此错误。
app.ts
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);
});
Versions
"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",