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

Sequelize中models.User.find()报TypeError,findAll正常的问题求助

解决Sequelize中find()方法抛出TypeError的问题

这问题我之前也踩过坑!根源是Sequelize的版本差异——从v4版本开始,官方直接移除了Model.find()这个方法,改用Model.findOne()来实现单条记录查询,这就是你调用find()时报错“不是函数”,但findAll()能正常工作的原因。

为什么会这样?

在Sequelize v3及更早的版本里,find()是用来获取匹配条件的第一条记录的,但官方在v4重构时废弃了这个方法,统一用findOne()来替代,功能完全对应。

你的代码修改方案

把你passport.deserializeUser里的find()替换成findOne(),同时注意findOne()返回的是单个对象(不是数组),所以要去掉代码里的user[0]:

var models = require('./models');
passport.deserializeUser(function(id, done) {
    console.log(`deserializeUser ${id}`) //Returns proper value
    // 替换find()为findOne()
    models.User.findOne({ where: { id: id } }).then(function(user){
        console.log(`users test: ${JSON.stringify(user)}`)
        // 直接访问user.userId,不需要user[0]
        console.log("User ID: " + user.userId + " is deserializing");
        done(null, user);
    }).catch(function(err) { 
        // 新版本推荐用catch()替代error()方法
        done(err, null);
    });
});

额外注意点

  1. 你可以通过运行npm list sequelize命令确认自己的Sequelize版本,如果是v4+,就必须使用findOne();
  2. 如果你习惯了旧写法,也可以自己给Model添加一个find()的封装,但官方不推荐,还是建议使用标准的findOne()来避免后续版本兼容问题。

内容的提问来源于stack exchange,提问作者cphill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:28:15