【问题标题】:How to send message to front-end using Passport.js Strategy如何使用 Passport.js 策略向前端发送消息
【发布时间】:2020-03-16 13:01:32
【问题描述】:

Passport.js 的新手在这里尝试做一件简单的事情。我只想向我的前端发送一条自定义消息,我使用“passport”:“^0.4.0”和“express”:“^4.17.0”和“passport-local”:“^1.0. 0”,但我似乎无法让它工作。我看到这与 express 4 有所不同,尝试下载 connect-flash 但无法正常工作。

这会正常发送错误消息:

res.status(401).send({
    message: 'Authentication key expired'
});

现在我正在尝试使用护照策略执行此操作,但似乎没有向客户端发送任何内容,但它发送了一个没有自定义消息的通用 401:

  passport.use(
    new LocalStrategy({usernameField: "login", passwordField: "password"}, (login, password, done) => {
      User.findByLogin(login).then(async user => {
        if (!user) {
          return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(password)) {
          return done(null, false, { message: 'Incorrect password.' });
        }
        let subscription = await user.getValidSubscription();
        if (!subscription) {
          return done(null, false, {
            message: 'Your subscription has expired.'
          });
        }
        user.dataValues.expiration = subscription.expiration;
        return done(null, user);
      });
    })
  );

再一次,我知道这是 Flash 消息和其他东西的问题,但是 难道没有简单的方法来发送自定义消息吗?我需要的只是“不正确的用户名”到达我的前端。 我已经花了几天时间,但仍然一无所获。 提前谢谢!

Edit1:使其更清晰。

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    尝试用npm install connect-flash安装flash

    然后转到您的 app.js 文件并编写以下内容:

    var flash = require('connect-flash'); app.use(flash())

    在您的护照功能中 添加这个 passReqToCallback

    { usernameField : 'login', passwordField : 'password', passReqToCallback : true }// allows us to pass back the entire request to the callback

    然后在您的参数(登录名、密码、完成)中,您可以像这样传递请求对象(req,login, password, done)

    终于可以这样发消息了

    if (!user.validPassword(password)) { return done(null, false, req.flash('signupMessage', 'Incorrect username.')); }

    【讨论】:

    • 您好,感谢您的帮助,按照您所说的做了并得到了错误:未处理的拒绝错误:req.flash() 需要 IncomingMessage._flash [as flash] (c:\Users\R2 \Documents\Projects\server- eusaudavel\node_modules\connect-flash\lib\flash.js:60:41) 在 User.findByLogin.then (c:\Users\R2\Documents\Projects\server- eusaudavel\routes\passport .js:31:40) 在 tryCatcher (c:\Users\R2\Documents\Projects\server-eusaudavel\node_modules\bluebird\js\release\util.js:16:23) ...
    • 另外,如果我尝试这个(来自已接受的答案):stackoverflow.com/questions/30563321/… 我得到:NodeError: Invalid status code: 1 at ServerResponse.writeHead (_http_server.js:209:11) at ServerResponse。在 ServerResponse._implicitHeader (_http_server.js:200:8) 上的 writeHead (c:\Users\R2\Documents\Projects\server-eusaudavel\node_modules\on-headers\index.js:44:26)...
    • 使用 return done(null, false, req.flash('Incorrect password.'));而不是 return done(null, false, req.flash('signupMessage', 'Incorrect username.'));没有给我无效的状态码:1,但它仍然只给出一个通用的 401 响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多