【问题标题】:passport.authenticate("local")(req, res, function () {} block not getting executedpassport.authenticate("local")(req, res, function () {} 块没有被执行
【发布时间】:2020-12-21 10:11:15
【问题描述】:

我是 MERN(Mongo,Express, React,Node) 的新手,我正在使用它来创建应用程序。我看到了一个关于护照的教程,并按照教程中所示的方式实现了它,但我不断收到“错误请求”在屏幕上呈现。

在我参加教练使用 express-ejs 护照的课程中,我只是推断出反应。

根据我所做的调试 - passport.authenticate() 函数永远不会被执行。散列密码和电子邮件被记录到我的 mongo 服务器,但它从未得到验证。我花了一整天的时间尝试调试,但无济于事。

下面是我输入的服务器端代码。 本地主机:5000 是我的快速服务器,本地主机:3000 是反应服务器任何帮助将不胜感激。错误代码 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.");
});

【问题讨论】:

    标签: node.js reactjs passport.js passport-local


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

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

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

    【讨论】:

      【解决方案2】:

      在 app.get("/secrets") 路由中使用 res.render("secrets");,而不是 URL res.redirect("http://localhost:3000/secrets"); 它会起作用。无需更改为 username 而不是 email id

      【讨论】:

        猜你喜欢
        • 2019-10-27
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多