gpt4 book ai didi

node.js - 为什么sequelize返回500 [object SequelizeInstance :Users] when connecting to express session?

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:33 28 4
gpt4 key购买 nike

问题:

我正在尝试使用 Passport 本地策略对用户进行身份验证。我可以成功从数据库检索用户,但是当我尝试重定向到“/”并启动新 session 时,我的服务器响应 500 [object SequelizeInstance:Users]

上下文:

我遇到了“connect-session-sequelize” Node 包并在我的 app.js 中实现了它:

const db = require('./models/db.js');
const userController = require('./controllers/user');
const myStore = new SequelizeStore({
db: db.sequelize,
table: 'Sessions'
});

app.use(cookieParser());
app.use(session({
secret: process.env.SESSION_SECRET,
store: myStore,
resave: false, // per the express-session docs this should be set to false
proxy: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.get('/login', userController.getLogin);
app.post('/login', userController.postLogin);
app.get('/signup', userController.getSignup);
app.post('/signup', userController.postSignup);

db.sequelize.sync({
force: false,
}).then(() => {
app.listen(app.get('port'), () => {
console.log('%s App is running at http://localhost:%d in %s mode', chalk.green('✓'), app.get('port'), app.get('env'));
});
});

我处理请求的路线:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const db = require('../models/db.js');
const User = db.user;

passport.serializeUser((user, done) => {
console.log('serializing user: ', user);
done(null, user);
});

passport.deserializeUser((id, done) => {
User.findById(id).then((user) => {
done(user);
});
});

passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
User.findOne({
where: { email: email.toLowerCase() },
}).then((user) => {
if (!user) {
return done(null, false, { msg: `Email ${email} not found.` });
}
user.comparePassword(password, (err, isMatch) => {
if (err) { return done(err); }
if (isMatch) {
return done(null, user);
}
return done(null, false, { msg: 'Invalid email or password.' });
});
});
}));

exports.postSignup = (req, res, next) => {
const errors = req.validationErrors();
const user = new User({
username: req.body.name,
email: req.body.email,
password: req.body.password
});

User.findOne({
where: { email: req.body.email }
}).then((existingUser) => {
if (existingUser) {
req.flash('errors', { msg: 'Account with that email address already exists.' });
return res.redirect('/signup');
}
user.save((err) => {
req.logIn(user, (err) => {
req.session.save(() => res.redirect('/'));
});
});
});
};

“用户”数据库模型:

const bcrypt = require('bcrypt-nodejs');

module.exports = (sequelize, DataTypes) => {
const Users = sequelize.define('Users', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
allowNull: false,
unique: true
},
username: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password_hash: {
type: DataTypes.STRING
},
password: {
type: DataTypes.VIRTUAL,
allowNull: false,
unique: false,
set(value) {
const that = this;
bcrypt.genSalt(10, (err, salt) => {
if (err) { return console.log('BCRYPT GEN SALT ERR:', err); }

bcrypt.hash(value, salt, null, (error, hash) => {
if (error) { return console.log('BCRYPT HASH ERR:', err); }

console.log('--> SEQ: BCRYPT hash SET', hash);
that.setDataValue('password', value);
that.setDataValue('password_hash', hash);
});
});
}
}
});

Users.prototype.comparePassword = function comparePassword(candidatePassword, cb) {
bcrypt.compare(candidatePassword, this.password_hash, (err, isMatch) => {
cb(err, isMatch);
});
};
return Users;
};

“ session ”数据库模型:

module.exports = (sequelize, DataTypes) => sequelize
.define('Sessions', {
sid: {
type: DataTypes.STRING,
primaryKey: true
},
userId: DataTypes.STRING,
expires: DataTypes.DATE,
data: DataTypes.STRING(50000),
});

服务器响应:

POST /login 302 234.474 ms - 46

Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt","updatedAt" FROM "Sessions" AS "Sessions" WHERE "Sessions"."sid" ='Jhmo9YA9MhwKEVa6zWxvvRQGdYoXmdSQ';

Executing (default): SELECT "id", "username", "email", "password_hash", "phone","age", "gender", "location", "createdAt", "updatedAt" FROM "Users" AS "Users"

WHERE "Users"."id" = 'c40d4cd6-4937-4a66-b785-d302e9fa6c40';

Executing (default): UPDATE "Sessions" SET "expires"='2018-05-10 06:31:42.797+00:00',"updatedAt"='2018-05-09 06:31:42.797 +00:00' WHERE "sid" ='Jhmo9YA9MhwKEVa6zWxvvRQGdYoXmdSQ'

[object SequelizeInstance:Users]GET / 500 5.420 ms - -

最佳答案

deserializeUser 应该首先调用 done 并出现错误:

passport.serializeUser((user, done) => {
console.log('serializing user: ', user.id);
done(null, user.id);
});

passport.deserializeUser((id, done) => {
User.findById(id).then((user) => {
done(null, user);
}).catch(done);
});

关于node.js - 为什么sequelize返回500 [object SequelizeInstance :Users] when connecting to express session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50250094/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com