NodeJS中Sequelize的findOne返回null但数据库存在对应数据
Sequelize查询User表返回null但数据库存在对应记录的问题
问题详情
在Node.js中使用Sequelize操作数据库时,明明User表中存在对应邮箱的记录,但调用findOne方法查询却返回null。
相关代码
User模型定义
module.exports = (sequelize, DataTypes) => { const User = sequelize.define("User", { email: { type: DataTypes.STRING, allowNull: false, unique: true }, password: { type: DataTypes.STRING, allowNull: false } }) return User }
Login接口查询逻辑
app.post("/login", (req, res) => { let email = req.body.email User.findOne({ where: { email: email } }).then((result) => { if (result == null) { console.log("data is null", result) res.send("No data found") } else { res.send(result) } }).catch((err) => { console.log(err, "Error in find one") }) })
终端输出日志
Executing (default): SELECT `id`, `email`, `password`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`email` = 'abc@gmail.com'; data is null null
数据库User表中确实存在abc@gmail.com的记录。
排查与解决方法
校验大小写一致性
数据库的字符串比较规则可能区分大小写(如MySQL使用utf8_bin编码时),确认数据库中邮箱的大小写和查询参数完全匹配,比如数据库中是ABC@gmail.com,而查询用abc@gmail.com会导致匹配失败。清理参数中的隐藏字符
请求传入的邮箱可能带有前后空格或不可见字符,先对参数做 trim 处理:let email = req.body.email.trim()同时直接在数据库中执行终端输出的SQL语句,验证是否能查到数据。如果数据库执行能查到,打印
req.body.email的长度和原始内容,排查是否存在换行、制表符等隐藏字符。确认数据库连接正确性
检查Sequelize的配置文件,确保连接的是你查看记录的目标数据库,避免连接到测试环境或其他实例的数据库。核对表名与字段名
Sequelize默认会将模型名User转为复数Users作为表名,从日志看查询的是Users表,确认数据库中的表名一致(注意Linux系统下表名区分大小写)。同时检查数据库中字段名是否为email,无拼写错误。
内容的提问来源于stack exchange,提问作者kashif
相关产品推荐
相关产品推荐

