Passport.authenticate“ local”req,res,function{}块未执行

问题描述

我是MERN(Mongo,Express,React,Node)的新手,正在使用它来创建应用程序。我看到了一个有关护照的教程,并按照教程中的说明完全实现了它,但是我一直在屏幕上看到“错误请求”的呈现。

在我使用教练使用护照进行Express-EJS的过程中,我只是推断出这是有反应的。

基于我所做的调试,从未执行过password.authenticate()函数。散列的密码和通过电子邮件发送的日志会记录到我的mongo服务器上,但永远不会得到验证。我花了一整天的时间进行调试,但无济于事。

下面是我输入的服务器端代码 Localhost:5000是我的快速服务器,而localhost:3000是我的快速服务器,我们将不胜感激。错误代码400 btw

 * 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",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",res) {
   console.log("debug:wrkbj");
   res.redirect("http://localhost:3000/main");
});


app.listen(5000,function () {
    console.log("Server live on port 5000.");
});

解决方法

  1. 将您的架构更改为- const userSchema = new mongoose.Schema({ 用户名:字符串, 密码:字符串 });

  2. 在您的 app.post("/register" ... 部分,将用户名设为- { 用户名:req.body.username }

由于您的注册方法注册了一个新用户,其中电子邮件存储在用户名中,因此您不能在 userSchema 中使用“电子邮件”。 您还应该将视图文件夹中 register.ejs 文件中的所有“emailId”名称属性替换为“用户名”。这将解决问题。