我是 MERN(Mongo、Express、React、Node)的新手,正在使用它来创建一个应用程序。我看到了一个关于护照的教程,并完全按照教程中所示的方式实现了它,但我不断收到“错误请求”在屏幕上渲染。
在课程中,我使用了教练使用的护照进行express-ejs,我只是推断出反应。
根据我所做的调试 - Passport.authenticate() 函数永远不会被执行。哈希密码和电子邮件被记录到我的 mongo 服务器,但它从未得到验证。我花了一整天的时间尝试调试,但没有成功。
下面是我输入的服务器端代码。 Localhost:5000 是我的 Express 服务器,localhost:3000 是 React 服务器任何帮助将不胜感激。错误代码 400 顺便说一句
* Require Dependencies
*/
const express = require('express');
const bodyParser = require('body-parser');
const ejs = require('ejs');
const mongoose = require('mongoose');
const session = require('express-session');
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const app = express();
app.use(express.static("public"));
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(session({
secret: "Our little secret.",
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://localhost:27017/userDB", {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.set("useCreateIndex", true);
const userSchema = new mongoose.Schema({
email: String,
password: String
});
userSchema.plugin(passportLocalMongoose);
const User = new mongoose.model("User", userSchema);
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
////////////////////////////// Get Request Block //////////////////////////////
app.get("/secrets", function (req, res) {
if (req.isAuthenticated()) {
res.redirect("http://localhost:3000/secrets");
} else {
res.redirect("/register");
}
});
/////////////////////////////////////////////////////////////////////////////////
app.post("/register", function (req, res) {
User.register({ username: req.body.emailId }, req.body.password, function (err, user) {
if (err) {
console.log(err);
res.redirect("/error");
} else {
console.log("me");
passport.authenticate("local")(req, res, function () {
console.log("met1e1e");
res.redirect("/secrets");
});
// passport.authenticate('local', {
// successRedirect: '/secrets',
// failureRedirect: '/error',
// failureFlash: true
// });
}
});
});
app.get("/error", function (req, res) {
console.log("debug:wrkbj");
res.redirect("http://localhost:3000/main");
});
app.listen(5000, function () {
console.log("Server live on port 5000.");
});
将您的架构更改为- const userSchema = new mongoose.Schema({ 用户名:字符串, 密码:字符串 });
在你的 app.post("/register" ... 部分,将用户名设置为- { 用户名:req.body.用户名 }
由于您的注册方法注册了一个新用户,其中电子邮件存储在用户名中,因此您不能在 userSchema 中使用“电子邮件”。 您还应该将views文件夹中的register.ejs文件中的所有“emailId”名称属性替换为“username”。这将解决问题。
在 app.get("/secrets") 路由中使用
res.render("secrets");
,而不是 URL res.redirect("http://localhost:3000/secrets");
它将起作用。无需更改为 用户名 而不是 电子邮件 ID。
您应该添加一个 if 语句来捕获用户是否正在退出。然后就可以正常工作了。
if(user){
passport.authenticate("local")(req, res, function (){
res.redirect("/secrets");
});
}
将其与您的代码进行比较
app.get('/secrets', (req, res) => {
if (req.isAuthenticated()) {
res.render("secrets");
} else {
res.redirect('/login');
}
});
User.register({ username: req.body.username },
req.body.password).then(function(user) {
if (user) {
passport.authenticate("local")(req, res,
function() {
res.redirect("/secrets");
})
}
}).catch(function(err) {
console.log(err);
res.redirect("/register")
})