我正在使用 express 和passport.js 制作登录系统,当我提交表单时出现以下错误:
感谢我的护照文件有一些错误,我在那里配置了它,但我看到了一个存储库并将文件与我的文件进行了比较,我没有发现任何问题。
这是我的护照文件:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const pool = require('../settings/db');
const bcrypt = require('./bcrypt');
passport.use('local.signin', new LocalStrategy({
username: 'username',
password: 'password',
passReqToCallback: true
}, async (req, username, password, done) => {
const query = await pool.query('SELECT * FROM users WHERE username = ?', [username]);
console.log(req.body);
if (query.length > 0) {
const user = query[0];
const validPassword = await bcrypt.matchPass(password, user.password);
console.log('Hay algo en la consulta: ' + query);
console.log(req.body);
if (validPassword) {
console.log('Contraseña valida');
return done(null, user, req.flash('success', `Welcome ${user.username}`));
} else {
console.log('Contraseña invalida');
return done(null, false, req.flash('message', 'Contraseña incorrecta'));
}
} else {
return done(null, false, req.flash('message', 'Nombre de usuario incorrecto'));
}
}));
passport.serializeUser((user, done) => {
console.log(`Serialize: ${user}`);
return done(null, user.id);
});
passport.deserializeUser(async (id, done) => {
const rows = await pool.query('SELECT * FROM users WHERE id = ?', [id]);
return done(null, rows[0]);
});
这是我的 router.js,我使用身份验证方法尝试登录用户:
const express = require('express');
const app = express.Router();
const RegisterController = require('../controllers/RegisterController');
const LoginController = require('../controllers/LoginController');
const passport = require('passport');
app.get('/', (req, res) => {
res.render('index');
});
app.get('/formulario-registro', RegisterController.index);
app.post('/register', RegisterController.register);
app.get('/formulario-login', LoginController.index);
app.post('/login', (req, res, next) => {
console.log('Informacion recibida');
console.log(req.body);
const handler = passport.authenticate("local.signin", {
successRedirect: '/perfil',
failureRedirect: '/formulario-login',
failureFlash: true
});
console.log(handler);
handler(req, res, next);
});
app.get('/perfil', (req, res) => {
res.render('profile');
});
module.exports = app;
和 index.js,我放置应用程序配置(视图引擎、护照初始化等)的主文件:
//*imports
const express = require("express");
const morgan = require("morgan");
const pool = require('./settings/db');
const hbs = require('express-handlebars');
const path = require('path');
const app = express();
const session = require('express-session');
const cookieParser = require('cookie-parser');
const passport = require('passport');
const {database} = require('./settings/keys');
const MySQLStore = require('express-mysql-session')(session);
//*configuracion puerto
app.set('port', process.env.PORT || 4000); //* se establece el puerto del servidor.
//*configuracion motor de plantillas
app.set('views', path.join(__dirname, 'views'));
app.engine('.hbs', hbs({
defaultLayout: 'main', //*establece la plantilla principal
layoutsDir: path.join(app.get('views'), 'layout'), //*hace referencia al directorio donde se encuenta la plantilla.
partialsDir: path.join(app.get('views'), 'partials'), //*hace referencia a los partials (partes html que se usan en varias páginas)
extname: '.hbs'
}));
app.set('view engine', '.hbs'); //*establece el motor de plantillas
//*middlewares
app.use(morgan('dev')); //*permite ver mensajes más específicos del servidor.
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.urlencoded({
extended: false
})); //*permite obtener el 'cuerpo' (datos) de los formularios.
app.use(cookieParser('my ultimate secret'));
app.use(session({
secret: 'my ultimate secret',
resave: false, //*guarda la sesion aunque no haya sido modificada
saveUninitialized: false, //*si inicializamos una sesion en una peticion y no guardamos nada, aun asi sera almacenada
store: new MySQLStore(database)
}));
app.use(passport.initialize());
app.use(passport.session());
//*rutas app
app.use(require('./routes/app'));
app.listen(app.get('port'), () => {
console.log(`Server on port ${app.get('port')}`);
});
提前致谢。