首页 > 解决方案 > 使用 PassportJS 时 POST 请求挂起

问题描述

我正在使用本教程来学习 PassportJS。我将他们的数据存储在 MongoDB 中并使用 Postman Desktop 进行测试。我正在发送/register带有电子邮件密码字段的发布请求。当电子邮件存在时,请求执行并且我得到预期的响应:Email is already taken.但是,当电子邮件是唯一的时,请求将挂起,并且 Postman 将卡在Sending Request消息上而不会显示任何错误。

前任。发送邮件:test和密码:test,终端指示POST /register?email=test&password=test 302 58.162 ms - 30,Postman 不断加载Sending Request。此时,数据库中没有任何变化,但是,当我取消请求时,该条目已成功添加到数据库中。最后终端显示GET /profile - - ms - -

以下是相关代码:

用户.js

const mongoose = require("mongoose");
const bcrypt = require("bcrypt");

const userSchema = mongoose.Schema({
  email: {
    type: String,
    unique: true,
  },
  password: {
    type: String,
  },
});

userSchema.methods.generateHash = (password) => {
  return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

userSchema.methods.validPassword = (password) => {
  return bcrypt.compareSync(password, this.password);
};

module.exports = mongoose.model("User", userSchema);

路由.js

module.exports = (app, passport) => {
  app.get("/", (req, res) => {
    res.json("Welcome to nodeJS auth App. Please register/login");
  });
  app.get("/register", (req, res) => {
    res.json({ message: req.flash("registerMessage") });
  });

  app.post(
    "/register",
    passport.authenticate("register", {
      successRedirect: "/profile",
      successFlash: true,
      failureRedirect: "/register",
      failureFlash: true,
    })
  );
...

护照.js

const LocalStrategy = require("passport-local").Strategy;
const User = require("../models/user");
module.exports = function (passport) {
  passport.serializeUser(function (user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
      done(err, user);
    });
  });

  passport.use(
    "register",
    new LocalStrategy(
      {
        usernameField: "email",
        passwordField: "password",
        passReqToCallback: true,
      },
      function (req, email, password, done) {
        User.findOne({ email: email }, function (err, user) {
          if (err) {
            return done(err);
          }
          if (user) {
            return done(
              null,
              false,
              req.flash("registerMessage", "Email is already taken.")
            );
          } else {
            const newUser = new User();
            newUser.email = email;
            newUser.password = newUser.generateHash(password);
            newUser.save(function (err) {
              if (err) throw err;
              return done(null, newUser);
            });
          }
        });
      }
    )
  );
...

服务器.js

const express = require("express"),
  app = express();
const morgan = require("morgan");
const flash = require("connect-flash");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const passport = require("passport");

const config = require("./config/database");
const port = process.env.PORT || 3000;

require("./config/passport")(passport);
app.use(express.json());
app.use(express.urlencoded({ urlencoded: true, extended: false }));
app.use(cookieParser());
app.use(morgan("dev"));
app.use(
  session({
    secret: "secret123",
    saveUninitialized: true,
    resave: true,
  })
);
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
require("./routes/routes")(app, passport);

app.listen(port, () => {
  console.log("Server on port " + port);
});

到目前为止,我已经检查了至少 10 个存在类似问题的 Stack Overflow 链接,这就是我尝试过的:

我在整个调试过程中发现,传入passport.js 可能存在一些问题newUserdone()这也可能导致serializeUser函数出现问题。请注意,我看到的大多数 Stack Overflow 问题都来自 2 年前,这可能导致在遵循他们的建议时缺乏适当的功能。

如果您花时间回答这个问题,请向我提供有关我如何提出这个问题的反馈。我想更好地在这个网站上提问。

标签: node.jsexpressauthenticationpostpassport.js

解决方案


推荐阅读