我能够使用sequelize创建一个用户;但是,当我查询任何用户时,我得到Invalid value
错误。
Sequelize用户模型:
import DataTypes from "sequelize";
import bcrypt from "bcrypt";
import config from "../../config.js";
export default (sequelize) => {
sequelize.define("user", {
id: {
primaryKey: true,
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
},
username: {
type: DataTypes.STRING(25),
allowNull: false,
unique: true,
},
password: {
type: DataTypes.STRING(60),
allowNull: false,
set(value) {
this.setDataValue(
"password",
bcrypt.hashSync(value, config.saltRounds)
);
},
},
isAdmin: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
},
});
};
质询:
import { sequelize as db } from "./database/index.js";
import Op from "sequelize";
import bcrypt from "bcrypt";
import config from "./config.js";
const hashedPwd = bcrypt.hashSync("pass", config.saltRounds);
db.models.user
.findOne({
where: {
[Op.and]: [{ username: "user" }, { password: hashedPwd }],
},
})
.then((user) => {
console.log(user);
console.log(user.id)
})
.catch((err) => {
console.log(err);
});
DB条目:
结果:
> node .\test.js
Error: Invalid value { username: 'user' }
at Object.escape (node_modules\sequelize\lib\sql-string.js:65:11)
at MariaDBQueryGenerator.escape (node_modules\sequelize\lib\dialects\abstract\query-generator.js:995:22)
at node_modules\sequelize\lib\dialects\abstract\query-generator.js:2572:69
at Array.map (<anonymous>)
at MariaDBQueryGenerator._whereParseSingleValueObject (node_modules\sequelize\lib\dialects\abstract\query-generator.js:2572:52)
at MariaDBQueryGenerator.whereItemQuery (node_modules\sequelize\lib\dialects\abstract\query-generator.js:2354:19)
at node_modules\sequelize\lib\dialects\abstract\query-generator.js:2259:25
at Array.forEach (<anonymous>)
at MariaDBQueryGenerator.whereItemsQuery (node_modules\sequelize\lib\dialects\abstract\query-generator.js:2257:35)
at MariaDBQueryGenerator.getWhereConditions (node_modules\sequelize\lib\dialects\abstract\query-generator.js:2675:19)
型
为什么我查询的任何用户名都会导致Invalid value
错误?
3条答案
按热度按时间5jdjgkvh1#
首先,尝试像这样导入
Op
,它不是default
导出。其次,顶层
Op.and
可以替换为最后(与这个问题完全无关),
bcrypt
每次调用hash
(sync/async)时都会返回一个不同的字符串,这意味着where
条件总是找不到什么,所以我建议通过用户名/电子邮件查找用户,然后通过型
jdgnovmf2#
首先,Op应从sequelize导入为
然后,您可以使用唯一字段(email/phone_number)查询用户,如
这将给予你的用户,如果存在.然后你需要到比较他们的密码使用bcrypt,因为bcrypt将返回不同的字符串每一次.
2hh7jdfx3#
对于遇到此问题的其他人,请确保您没有将内容放在错误的位置。例如,Include不应放在Where中,而应放在它的同级中。