部署到Heroku后Heroku Postgres的数据无法在页面正常展示是什么原因?
问题根因及修复方案
- 核心原因:你传递给Handlebars模板的是Sequelize查询返回的实例对象,而非普通JavaScript对象。本地开发环境下模板引擎默认允许访问Sequelize实例的动态getter属性,而Heroku的生产环境中Handlebars默认启用性能优化规则,禁止访问非对象自身的属性、不会触发Sequelize的属性getter,因此无法读取
departmentId等字段,直接打印实例只会输出[object SequelizeInstance:Department]。你之前绕过模板直接返回JSON正常,是因为Express响应JSON时会自动调用Sequelize实例的toJSON()方法转换为普通对象,所以字段可以正常输出。 - 修复方法1:查询时直接返回纯对象
在Sequelize的查询方法中添加raw: true配置,查询结果会直接返回普通JSON对象,无需额外转换:// 示例查询代码 const data = await Department.findAll({ raw: true }) res.render('你的模板文件名', { data }) - 修复方法2:手动转换实例为普通对象
如果需要保留Sequelize实例的方法做其他操作,可以在传给模板前调用实例的toJSON()方法转换:const instances = await Department.findAll() const data = instances.map(item => item.toJSON()) res.render('你的模板文件名', { data }) - 可选排查项:如果以上方法仍未解决,检查Sequelize全局配置的
underscored参数是否在生产环境被设置为true,该参数会自动将驼峰命名的模型字段转换为蛇形命名存储到数据库,此时返回的字段名为department_id而非departmentId,需要对应修改模板中的字段名或者关闭该配置。
内容的提问来源于stack exchange,提问作者keppodon
相关产品推荐
相关产品推荐

