Sequelize "Error: Invalid value" on simple query
Sequelize "Error: Invalid value" on simple query
我能够使用 sequelize 创建用户;但是,我在查询任何用户时收到 Invalid value
错误。
续集用户模型:
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);
});
数据库条目:
结果:
> 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
错误?
首先,尝试像这样导入 Op
。它 is not 一个 default
出口。
import { Op } from 'sequelize';
其次,顶级Op.and
可以替换为
db.models.user
.findOne({
where: {
username: 'user',
password: hashedPwd,
},
})
最后(与这个问题完全无关),bcrypt
每次 hash
(sync/async) 调用都会 return 一个不同的字符串。这意味着你的 where
条件总是找不到东西。所以我建议通过 username/email 查找用户,然后通过
检查密码
db.models.user.findOne({ where: { username: 'myUsername' } })
.then((user) => {
return bcrypt.compareSync('myPassword', user.password)
})
.then((isMatch) => {
if (!isMatch) {
throw new Error('UNAUTHORIZED') // or whatever
}
})
首先,Op 应该从 sequelize 导入为
import { Op } from 'sequelize';
然后你可以通过使用唯一字段(email/phone_number)来查询用户,如
db.models.user.findOne({
where: {username: "username"}
})
这将为您提供用户(如果存在)。那么您需要使用 bcrypt 比较他们的密码,因为 bcrypt 每次都会返回不同的字符串。
我能够使用 sequelize 创建用户;但是,我在查询任何用户时收到 Invalid value
错误。
续集用户模型:
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);
});
数据库条目:
结果:
> 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
错误?
首先,尝试像这样导入 Op
。它 is not 一个 default
出口。
import { Op } from 'sequelize';
其次,顶级Op.and
可以替换为
db.models.user
.findOne({
where: {
username: 'user',
password: hashedPwd,
},
})
最后(与这个问题完全无关),bcrypt
每次 hash
(sync/async) 调用都会 return 一个不同的字符串。这意味着你的 where
条件总是找不到东西。所以我建议通过 username/email 查找用户,然后通过
db.models.user.findOne({ where: { username: 'myUsername' } })
.then((user) => {
return bcrypt.compareSync('myPassword', user.password)
})
.then((isMatch) => {
if (!isMatch) {
throw new Error('UNAUTHORIZED') // or whatever
}
})
首先,Op 应该从 sequelize 导入为
import { Op } from 'sequelize';
然后你可以通过使用唯一字段(email/phone_number)来查询用户,如
db.models.user.findOne({
where: {username: "username"}
})
这将为您提供用户(如果存在)。那么您需要使用 bcrypt 比较他们的密码,因为 bcrypt 每次都会返回不同的字符串。