node.js - 使用 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 链接,这就是我尝试过的:
- 重新安装邮递员
process.nextTick()
在 passport.js 中添加注册功能之外console.log()
调试done()
在调用函数之前关闭数据库连接- 在函数内部将 const 更改为 var
- 使用响应行添加
(req,res) => {}
到POST /register
路线。
我在整个调试过程中发现,传入passport.js 可能存在一些问题newUser
,done()
这也可能导致serializeUser
函数出现问题。请注意,我看到的大多数 Stack Overflow 问题都来自 2 年前,这可能导致在遵循他们的建议时缺乏适当的功能。
如果您花时间回答这个问题,请向我提供有关我如何提出这个问题的反馈。我想更好地在这个网站上提问。
解决方案
推荐阅读
- go - 为任何客户端创建 HTTPS 测试服务器
- python - Python 2.7 VSCODE 没有得到正确长度的输入字符串
- openoffice-calc - 合并openoffice中的单元格删除特定的空格
- flutter - 如何找到 InputDecoration 的 contentPadding?
- python - python中的哨兵循环
- asp.net-core-webapi - 为 Windows 安装 .NET Core 2.2 Runtime & Hosting Bundle 后所有应用程序出现 503“服务不可用”错误
- boost - LNK1104 无法打开文件“libboost_filesystem-vc141-mt-sgd-x32-1_69.lib”
- android - 从助手操作到 Android 应用程序的深度链接
- android - how to solve Multiple dex files define Lcom/google/android/gms/measurement/AppMeasurement;
- firebase - I get an error when I try to deploy my website with Firebase Hosting - Error: An unexpected error has occurred