passport.authenticate() 没有重定向

passport.authenticate() isn't redirecting

我的护照中间件有问题,当我对用户进行身份验证时它没有重定向我不知道出了什么问题。

这是 GitHub 上的代码和整个项目:

const express = require("express");
const router = express.Router();
const passport = require("passport");
const genPassword = require("../passwordUtils").genPassword;
const connection = require("../database");
const User = connection.models.User;
// const logRegController = require("../controllers/log-reg-controller");

router.post(
  "/login",
  passport.authenticate("local", {
    successRedirect: "/",
    failureRedirect: "/register",
  })
);

router.post("/register", async (req, res) => {
  const existingUser = await User.findOne({ username: req.body.username });
  if (existingUser) return res.json({ message: "User already exists" });

  const saltHash = genPassword(req.body.password);

  const { salt, hash } = saltHash;

  const newUser = new User({
    username: req.body.username,
    hash: hash,
    salt: salt,
  });

  newUser.save().then((user) => console.log(user));

  res.status(201).json({ message: "All good" });
});

module.exports = router;

https://github.com/Oliwier965/Photo-App/tree/main

你可以尝试使用重定向的回调函数你可以根据Docs

这样做
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/register'); }
    req.logIn(user, function(err) {
        if (err) { return next(err); }
        //If Successful
        return res.redirect('/');
    });
    })(req, res, next);
});

亲爱的 Whosebug 社区,这是一场具有挑战性的战斗,但我从中得到了答案。

问题是我使用 javascript fetch() 发送 post 请求,它是一个用于发出 AJAX 请求的接口。它专门设计用于不改变您的 URL。我的解决方案是发送我想通过 res.json() 重定向的 URL 状态 302 并使用前端重定向。希望它能帮助我附上下面的代码的人。

后端

router.post("/login", function (req, res, next) {
  passport.authenticate("local", function (err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(302).json({ redirectUrl: "/register" });
    }
    req.logIn(user, function (err) {
      if (err) {
        return next(err);
      }
      //If Successful
      return res.status(302).json({ redirectUrl: "/" });
    });
  })(req, res, next);
});

前端

const login = async function (e) {
  e.preventDefault();
  const username = loginForm.querySelector("#email").value;
  const password = loginForm.querySelector("#password").value;

  const response = await fetch("/login", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      username,
      password,
    }),
  });

  const result = response.json();

  const data = await result;

  const { redirectUrl } = data;

  window.location.href = redirectUrl;
};