因此,我试图通过遵循“ 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并且我使用了完全相同的代码作为他(...
我无法回答,因为我遇到了完全相同的问题。但是我注意到的一件事是,在原始视频(YouTube视频)中,他没有在[]中返回任何内容
电子邮件=> users.find(用户=> user.email ===电子邮件)