typescript - TypeError:req.logIn 不是函数 - Passport JS
问题描述
我很确定这不是一个错误,因为谷歌搜索它没有出现任何问题。
我正在使用带有本地策略的护照 JS。在我的登录路线上,我使用自定义回调并在确定用户存在后调用 req.login 因为文档说:
请注意,当使用自定义回调时,应用程序负责建立会话(通过调用 req.login())并发送响应
但是,它一直说 reg.logIn 未定义(请注意,您可以调用 reg.login 或 req.logIn ,因为它们是别名。我也尝试过两者)。我的 IDE 正在获取 typescript 定义,我可以看到在已编译的 app.js 文件的输出中定义的 req.logIn 函数,所以我不确定为什么会出现此错误。
应用程序.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);
});
版本
"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());
推荐阅读
- mysql - MySQL 'addInstance' 修复
- primefaces - 如何使用 JavaScript 聚焦 ap:dataTable 单个可选行
- angular - 如何以不同的角度多次调用相同的API
- angular - 控制台出现错误后,角度路由更新为未知值
- firebase - 有没有办法删除或撤回 fcm 发送的推送通知
- amazon-web-services - 存储桶之间的 cli s3 同步返回 NoSuchTagSetError
- python - 在 Python 中将字符串转换为数学集合运算
- user-interface - 如何在 appBuilder 中定义准确性?
- csv - 请求正文中的值在 jmeter 中没有出现双引号
- stata - 统计扩展具体观察