首页 > 解决方案 > 如何在 React 中使用来自您的 passportjs 策略的访问消息

问题描述

如果您有一个反应应用程序并且不想connect-flash用来访问本地策略生成的消息,您可以使用以下内容:

我的护照本地策略,我使用的是 sqlite db:

 passport.use(
        new LocalStrategy({ usernameField: 'name' },
        (name, password, done) => {
            //Match user
            db.get(`SELECT * FROM Users WHERE name = '${name}'`, (err, user) => {
                if(err) throw err;
                if(!user) {
                    return done(null, false, { message : 'Username not registered' });
                }
                //Match password
                bcrypt.compare(password, user.password, (err, isMatch) => {
                    if(err) throw Error;
                    if(isMatch) {
                        done(null, user, { message : 'Log in successful' });
                    } else {                        done(null, false, { message : 'Password incorrect' })
                    }
                });
            })
        })
    );

标签: javascriptreactjspassport.jsmessageflash-message

解决方案


您可以为 /login 路由使用自定义回调函数:

app.post('/login', (req, res, next) => {
    passport.authenticate('local', (err, user, info) => {
      if (err) { return next(err); }
      if (!user) { return res.json(info); }
      req.logIn(user, (err) => {
        if (err) { return next(err); }
        return res.json(info);
      });
    })(req, res, next);
  });

info 参数包含在 done() 中作为第三个参数从策略传递的对象,并且可以添加到 res 的主体中,因此被 react 使用。


推荐阅读