NodeJS 序列化“错误:简单查询中的值””无效

6mzjoqzu  于 2022-12-18  发布在  Node.js
关注(0)|答案(3)|浏览(130)

我能够使用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错误?

5jdjgkvh

5jdjgkvh1#

首先,尝试像这样导入Op,它不是default导出。

import { Op } from 'sequelize';

其次,顶层Op.and可以替换为

db.models.user
  .findOne({
    where: {
      username: 'user',
      password: hashedPwd,
    },
  })

最后(与这个问题完全无关),bcrypt每次调用hash(sync/async)时都会返回一个不同的字符串,这意味着where条件总是找不到什么,所以我建议通过用户名/电子邮件查找用户,然后通过

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
    }
  })

jdgnovmf

jdgnovmf2#

首先,Op应从sequelize导入为

import { Op } from 'sequelize';

然后,您可以使用唯一字段(email/phone_number)查询用户,如

db.models.user.findOne({
 where: {username: "username"}
})

这将给予你的用户,如果存在.然后你需要到比较他们的密码使用bcrypt,因为bcrypt将返回不同的字符串每一次.

2hh7jdfx

2hh7jdfx3#

对于遇到此问题的其他人,请确保您没有将内容放在错误的位置。例如,Include不应放在Where中,而应放在它的同级中。

相关问题