将 req.user.username 作为参数传递给 Passport.js 中的 successRedirect

Pass req.user.username as a parameter to successRedirect in Passport.js

当用户成功登录后,我想将他们重定向到以用户名作为参数的路由:

router.post("/login", checkNotAuthenticated, passport.authenticate("local", {
    successRedirect: "/dashboard/" + req.user.username,
    failureRedirect: "/login",
    failureFlash: true,
  })
);
router.get("/dashboard/:username", checkAuthenticated, (req, res) => {
  res.render("dashboard", { user: req.user });
});

当我尝试这样做时,出现以下错误:

successRedirect: "/dashboard/" + req.user.username,                                     
                                 ^
ReferenceError: req is not defined

(我明白为什么 req is not defined,但我展示这个是为了说明我想做什么。)

我已经通过将路线更改为以下内容进行了测试:

router.post("/login", (req, res) => {
  console.log(req.body.username);    // a test; prints what is expected
  passport.authenticate("local", {
    successRedirect: "/dashboard/" + req.body.username,
    failureRedirect: "/login",
    failureFlash: true,
  });
});

当我使用详细信息登录时,console.log(...) 按预期工作并打印用户名。但是,successRedirect 不起作用,因为它一直在加载。控制台也没有任何形式的输出。

然后我也尝试了 req.user.username(在最近的路线中),但它只是打印:

TypeError: Cannot read property 'username' of undefined

最后补充一下,当我console.log(req.body),我得到:

[Object: null prototype] { username: 'user1', password: 'user1' }

有什么我不明白的地方吗?

我在这里引用文档:

app.post('/login',
  passport.authenticate('local'),
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    res.redirect('/users/' + req.user.username);
  });

passport.authenticate('local')作为一个中间件,将调用下一个可以访问Req对象的函数。

我找到了解决方案(在写这篇文章后很快 post)。我认为仍然值得注意,以防其他人处于这种情况。

router.post(
  "/login",
  passport.authenticate("local", {
    failureRedirect: "/login",
    failureFlash: true,
  }),(req, res) {
    res.redirect("/dashboard/" + req.user.username);
  }
);

我省略了successRedirect,因为成功登录无论如何都会运行路由功能;您所要做的就是考虑失败的登录尝试(即 failureRedirect,或处理 401 状态代码),因为您可以使用现在存在的 req.user 重定向用户。