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

Sequelize报错TypeError: findAll is not a function 技术求助

解决TypeError: SQNote.findAll is not a function问题

我来帮你排查这个问题,主要有两个关键错误导致了这个报错,咱们一步步来修复:

1. connectDB函数返回值错误

看你connectDB的最后一行:

return SQNote.sync;

这里你返回的是sync方法的引用(函数本身),而不是调用它得到的Promise。更关键的是,当你第二次调用connectDB时,if(SQNote) return SQNote.sync();这里是调用sync()返回Promise,这就导致两次调用connectDB的结果类型完全不一致:第一次是函数,第二次是Promise。

你需要把最后一行改成调用sync(),这样connectDB()返回的Promise最终会解析为SQNote模型实例,后续的then回调就能拿到正确的模型对象调用findAll了:

return SQNote.sync();

2. keylist里的map回调错误

在notes.map(note => notekey)这一行,notekey是未定义的变量,你实际想要访问的是每个note对象的notekey属性,所以需要修改为:

return notes.map(note => note.notekey);

修复后的完整代码

修复后的connectDB函数

exports.connectDB = function(){ 
  var SQNote; 
  var sequlz; 
  if(SQNote) return SQNote.sync(); 
  return new Promise((resolve, reject) => { 
    fs.readFile(process.env.SEQUELIZE_CONNECT, 'utf-8', (err, data) => { 
      if(err){ 
        reject(err); 
      } else{ 
        resolve(data); 
      } 
    }); 
  }) 
  .then(yamltext => { 
    return jsyaml.safeLoad(yamltext, 'utf-8'); 
  }) 
  .then(params => { 
    sequlz = new Sequelize(params.dbname, params.username, params.password, params.params); 
    SQNote = sequlz.define('Note', { 
      notekey: { 
        type: Sequelize.STRING, 
        primaryKey: true, 
        unique: true 
      }, 
      title: Sequelize.STRING, 
      body: Sequelize.STRING 
    }); 
    return SQNote.sync(); // 修复:调用sync()而非返回函数引用
  });
};

修复后的keylist函数

exports.keylist = function(){ 
  return exports.connectDB() 
  .then(SQNote => { 
    return SQNote.findAll({ attributes: [ 'notekey' ] }) 
    .then(notes => { 
      return notes.map(note => note.notekey); // 修复:访问note对象的notekey属性
    }); 
  });
};

额外小建议

你可以把SQNote的定义提到connectDB函数外部,这样缓存逻辑会更清晰,不过当前的修复已经足够解决你遇到的报错问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:44