首页 > 解决方案 > 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",

标签: typescriptpassport.jspassport-local

解决方案


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

app.use(passport.initialize());

推荐阅读