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 每次都会返回不同的字符串。