问题描述
所以我有一个登录表单,它向 app.js 发出 POST 请求:
//app.js file
const express = require("express");
const ejs = require("ejs");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const { check } = require('express-validator');
const passport = require("passport");
const session = require("express-session");
const UserLogin = require("./middlwares/user-login");
const User = require("./database/Users");
const app = express();
//setting ejs
app.set('view engine','ejs');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static("public"));
//setting sessions and passport
app.use(session({
secret: "Our little Secret for Sessions.",resave: false,saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
//Serializing and deserializing user for checking login status in cookie
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.post("/login",UserLogin);
然后在 user-login.js 中进行身份验证,其中包含 Passport.authenticate()。这是在另一个教程示例中工作的,我在主 app.js 本身中进行身份验证。但在这里,身份验证功能没有执行。我完全不明白为什么。我不知道如何调查在执行 Passport.authenticate() 时会发生什么。我尝试浏览文档,但无法弄清楚为什么它失败了。只是想将我在自己的项目中学到的东西付诸实践。
//user-login.js
const mongoose = require("mongoose");
const passport = require("passport");
const User = require("../database/Users");
module.exports = async (req,res) => {
const user = new User({
username: req.body.loginEmail,password: req.body.loginPassword
});
console.log(user.username + " and " + user.password);
req.login(user,function(err){
if (err) {
console.log("user log-in triggered but error: " + err);
} else {
console.log("before authenticate");
passport.authenticate("local")(req,res,function(){
console.log("after authenticate");
res.render("user-logged-in",{});
});
}
});
有什么帮助吗?刚刚开始使用 stackOverflow,所以如果代码转储是一种不好的提问方式,那么我们深表歉意。我也不明白这个语法 - passport.authenticate('local')(req,function(){});
解决方法
好的,我刚刚意识到发出 POST 请求的表单需要将其字段命名为用户名和密码,以便让 Passport.authenticate() 工作?这似乎是一种奇怪的强迫症。在我的 html 表单中,我将其命名为“loginEmail”,因为这也是我为最终用户使用的标签,这也是导致 Passport.authenticate() 失败的原因。
这不是文件结构或某些如此晦涩的原因!