Node.js登录鉴权报错:users.findOne is not a function如何解决
问题根因
你导出的users模型是一个需要接收sequelize、Sequelize两个参数的工厂函数,直接require后得到的是函数本身,不是Sequelize模型实例,自然不存在findOne方法。
步骤1:正确实例化模型
你需要先完成Sequelize的数据库初始化,再传入参数拿到可用的模型对象:
const { Sequelize } = require('sequelize'); // 替换为你自己的数据库连接配置 const sequelize = new Sequelize('你的数据库名', '数据库账号', '数据库密码', { host: '127.0.0.1', dialect: 'mysql' }); // 传入参数初始化模型,得到可用的模型实例 const UsersModel = require('./models/users')(sequelize, Sequelize);
步骤2:修正查询写法
Sequelize的查询条件需要放到where属性下,同时避免变量名冲突,修改接口代码:
app.post('/login', (req, res) => { const { email, password } = req.body; // 条件放到where字段下,使用初始化后的模型实例调用方法 UsersModel.findOne({ where: { email, password } }) .then(user => { if (!user) { return res.status(404).json({ message: 'Auth Failed' }) } res.status(200).json({ message: 'Logg In succesfull' }) }) // 补充异常捕获逻辑,避免未处理的Promise报错 .catch(err => { res.status(500).json({ message: 'Server Error', error: err.message }) }) })
可选优化(推荐)
一般项目中会在models文件夹下新建index.js统一初始化所有模型,避免每个用到模型的地方都重复写初始化逻辑。
小提示:当前逻辑直接明文比对密码,生产环境请务必使用bcrypt等加密工具对密码做哈希存储后再比对,避免数据泄露风险。
内容的提问来源于stack exchange,提问作者AskAnyWay
相关产品推荐
相关产品推荐

