Sequelize查询Postgres时findAll返回空响应且传参报错如何解决
问题原因
你遇到的三个核心问题是:
- 单个模型文件导出的是模型工厂函数,本身需要传入初始化好的Sequelize实例和DataTypes参数才能返回可用的模型对象,你直接调用或者传参错误就会触发类型报错
findAll是异步方法,你没有加await等待执行结果,直接返回Promise对象就会得到空响应- sequelize-cli自动生成的
models/index.js已经完成了所有模型的初始化工作,不需要你手动调用单个模型的工厂函数
正确使用方式
1. 导入自动初始化的模型集合
不要单独引入../models/books.js,直接引入models目录下的index.js导出的db对象即可,index.js已经自动加载了所有模型、完成了初始化逻辑:
const db = require('../models'); // 直接从db对象取已经初始化好的Books模型 const Books = db.Books;
2. 修改控制器代码,处理异步逻辑
findAll返回Promise对象,需要用async/await等待查询结果返回:
exports.allBooks = async (req, res) => { try { // 直接调用模型的findAll方法,不需要手动初始化模型 const booksJSON = await Books.findAll(); res.json(booksJSON); console.log(JSON.stringify(booksJSON)); } catch (err) { res.status(500).json({ error: err.message }); } };
手动初始化模型的可选方案(不推荐)
如果你确实需要绕开自动生成的index.js、手动初始化模型,需要先自行创建Sequelize连接实例,再传给模型工厂函数:
const { Sequelize, DataTypes } = require('sequelize'); const BooksFactory = require('../models/books.js'); // 自行创建Sequelize实例,参数替换为你的实际数据库配置 const sequelize = new Sequelize('数据库名', '用户名', '密码', { host: 'localhost', dialect: 'postgres' }); // 传入实例和DataTypes得到可用模型 const Books = BooksFactory(sequelize, DataTypes);
你之前遇到的TypeError: Class constructor model cannot be invoked without 'new'报错,就是因为传参错误导致工厂函数没有正确返回初始化后的模型,反而返回了未初始化的类,调用时缺少new关键字触发的,用上面的自动导入方式可以完全规避这个问题。
内容的提问来源于stack exchange,提问作者Mohammad Fahad
相关产品推荐
相关产品推荐

