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
相关产品推荐
相关产品推荐

