You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:41:02