本地Stratergy的Passport.js代码在登录模块中无法正常工作

问题描述 投票:0回答:1

因此,我试图通过遵循“ Web Dev Simplified”-https://youtu.be/-RCnNyD0L-s?t=1011的视频教程,为我的项目实施用户身份验证。

而且我使用了与他完全相同的代码(除了我使用mysql数据库存储数据,而他使用数组)。用于注册用户的所有代码都可以正常工作,但是登录部分无效。所有的护照配置代码都写在passport-config.js文件中。

问题是,即使getUserById函数返回的结果中有一个,我的password-config.js文件中的mysql.query()函数也不会返回用户(我可以确认,因为应用程序中的console.log(result[0]) .js实际上会打印用户对象)。当我在password-config.js文件中显示console.log(user)时,它将显示undefined

我想我知道问题出在哪里,但不知道如何解决。从终端代码片段(如下所示)可以明显看出,在读取用户并返回到app.js文件之前,将打印passport-config.js中的用户。

这是我的app.js文件:

const express = require("express");
const mysql = require('mysql');
const bodyparser = require('body-parser');
const bcrypt = require('bcryptjs');
const passport = require('passport');
const flash = require('express-flash');
const session = require('express-session');
const methodOverride = require('method-override');

const app = express();

const initializePassport = require('./passport-config')
initializePassport(
  passport,
  email_id =>{
       mysqlConnection.query("SELECT * FROM user_tbl WHERE email_id= "+mysql.escape(email_id), (err, result, fields) => {

        if (!err){

            if(result.length==0)
                return null;
            else{
                console.log(result[0]]);
                return result[0];
            }
        }
        else
            console.log(err);
            return null;
    })
  }
)

这是通行证配置文件:

const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcryptjs')

function initialize(passport, getUserByEmail) {
  const authenticateUser = async (email_id, password, done) => {
    const user = getUserByEmail(email_id)
    console.log("logging user:"+user)                               //"This prints undefined.WHYY?!?!?"
    if (user == null) {
      return done(null, false, { message: 'No user with that email' })
    }

    try {
      if (await bcrypt.compare(password, user.password)) {
        return done(null, user)
      } else {
        return done(null, false, { message: 'Password incorrect' })
      }
    } catch (e) {
      return done(e)
    }
  }

  passport.use(new LocalStrategy({ usernameField: 'email_id' }, authenticateUser))
  passport.serializeUser((user, done) => done(null, user.email_id))
  passport.deserializeUser((email_id, done) => {
    return done(null, getUserByEmail(email_id))
  })

}

module.exports = initialize

这是提交登录表单后的终端:

[nodemon] starting `node app.js`
Server has started on port 3010
Connection Established Successfully
logging user:undefined
RowDataPacket {
  email_id: '[email protected]',
  password: '$2a$05$Gvyn0CPZ0u8i93rZ9TTVPOvDYGlFbkaxiwIeUZIKmOgvspyWYjySC',
  user_name: 'someuser',
  mobile_no: 8377564281,
  address: 'some address',
  type_id: 3
}
    

因此,我试图通过遵循“ Web Dev Simplified”的视频教程来为我的项目实施用户身份验证-https://youtu.be/-RCnNyD0L-s?t=1011并且我使用了完全相同的代码作为他(...

javascript mysql node.js passport.js passport-local
1个回答
0
投票

我无法回答,因为我遇到了完全相同的问题。但是我注意到的一件事是,在原始视频(YouTube视频)中,他没有在[]中返回任何内容

电子邮件=> users.find(用户=> user.email ===电子邮件)

© www.soinside.com 2019 - 2024. All rights reserved.