Express+Sequelize使用bcryptjs哈希MySQL数据报db is not a function错误如何解决
问题原因
你引入的./models导出的db是Sequelize框架规范的对象集合,包含sequelize实例、所有已注册的模型对象,并非Knex之类可直接调用的数据库查询函数,因此你写的db('users')调用方式不符合Sequelize的用法,才会抛出db is not a function错误。
修复方案
- 先确认你的
./models目录下用户模型的定义名称,标准Sequelize脚手架生成的用户模型会以大驼峰命名挂载到db对象上,比如模型名为User,调用方式为db.User - 替换
/register接口中的插入逻辑,将原生SQL风格的insert改为Sequelize提供的create方法,同时注意插入的字段名要和你User模型定义的字段、数据库表字段完全匹配:
比如你的users表中密码字段名为password,修正后的接口代码如下:
app.post('/register', async (req, res) => { try { const { email, password } = req.body; const hash = await bcrypt.hash(password, 8); // 替换原来的db('users').insert逻辑 await db.User.create({ email: email, password: hash }); res.status(200).json('good') } catch (e) { console.log(e); res.status(500).send('something broke') } })
- 额外检查项:
- 确认
./models/index.js中已经正确注册了User模型,并且导出的db对象上存在User属性 - 确认User模型中定义的字段名、类型和数据库users表完全匹配,避免字段不匹配导致的后续报错
内容的提问来源于stack exchange,提问作者Muhammad Tarique
相关产品推荐
相关产品推荐

