【发布时间】:2021-02-27 16:44:22
【问题描述】:
我遇到了一个一周没能解决的问题......
当我将用户的电子邮件传递给数据库的查询时,sequelize 似乎一切正常并执行了这个查询,它从表中返回数据以及找到的结果,但执行findOne 函数的结果不是一个模型,为什么会发生这种情况,我该如何解决?
const email = 'email@example.com'
const user = await User.findOne({ where: { email }})
console.log(user.password) // undefined
这里是模型、服务和数据库连接
模型
import { DataTypes, Model } from "sequelize"
import { connection } from "./database"
class User extends Model {
readonly id: number
readonly email: string
password: string
username: string
readonly createdAt: Date
readonly updatedAt: Date
}
User.init(
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
email: {
type: DataTypes.STRING,
unique: true,
},
password: {
type: DataTypes.STRING,
},
username: {
type: DataTypes.STRING,
},
},
{
sequelize: connection,
modelName: "users",
createdAt: "created_at",
updatedAt: "updated_at",
}
)
export default User
服务
export async function loginUser(email: string, password: string): Promise<ServiceResponse<string>> {
try {
const user = await User.findOne({ where: { email } })
if (!user) {
throw Error("User not found")
}
if (!bcrypt.compareSync(password, user.password)) {
throw Error("User not found or password did not match")
}
const { password: _, ...payload } = user.toJSON()
const token = jwt.sign(payload, environment.jwt)
return { success: true, content: token }
} catch (error) {
return { success: false, error: error.message }
}
}
数据库连接
import { Sequelize } from "sequelize"
import { environment } from "../environment"
export const connection = new Sequelize(environment.database, {
dialect: "postgres",
logging: console.log,
dialectOptions: {
ssl: {
rejectUnauthorized: false,
},
},
})
这是日志
Executing (default): SELECT "id", "email", "password", "username", "created_at", "updated_at" FROM "users" AS "users" WHERE "users"."email" = 'email@example.com';
users {
dataValues: {
id: 9,
email: 'email@example.com',
password: '$2b$10$s0HFL9eBbcp3GcGkB9cDZuSiCjOEgfQB5lZLxhxXraRfvRF6voDfW',
username: null,
created_at: 2020-11-16T13:09:30.631Z,
updated_at: 2020-11-16T13:09:30.631Z
},
_previousDataValues: {
id: 9,
email: 'email@example.com',
password: '$2b$10$s0HFL9eBbcp3GcGkB9cDZuSiCjOEgfQB5lZLxhxXraRfvRF6voDfW',
username: null,
created_at: 2020-11-16T13:09:30.631Z,
updated_at: 2020-11-16T13:09:30.631Z
},
_changed: Set(0) {},
_options: {
isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes: [
'id',
'email',
'password',
'username',
'created_at',
'updated_at'
]
},
isNewRecord: false,
id: undefined,
email: undefined,
password: undefined,
username: undefined,
createdAt: undefined,
updatedAt: undefined
}
已用堆栈NextJS, Sequelize, PostgreSQL
我做错了什么?
【问题讨论】:
标签: node.js typescript postgresql sequelize.js next.js