如何读取Sequelize查询返回的JSON数据并在Handlebars模板中渲染
问题根因
你遇到的问题由两个原因共同导致:
- Sequelize 查询默认返回的是模型类的实例对象,不是普通 JS 纯对象,即使你用
JSON.stringify打印结果正常,嵌套的关联属性Behaviors仍然是 Sequelize 实例,Handlebars 直接读取时无法正确解析属性值。 - 你写的 Handlebars 属性访问语法存在错误,多余的点号会导致属性解析失败,最终直接输出实例对象的 toString 结果
[object SequelizeInstance:Behavior]。
解决方法
步骤1:将Sequelize实例转换为纯JSON对象
修改路由代码,传递给模板前调用 Sequelize 实例的 toJSON() 方法,将整个对象(包括嵌套的关联数据)转为普通 JS 纯对象:
router.get('/findBehavior/:student_id', async (req, res) => { console.log("---> req.params.student_id :" + JSON.stringify(req.params.student_id)); const student = await Student.findByPk(req.params.student_id,{ include: Behavior, }); console.log("---> student :" + JSON.stringify(student)); // 新增toJSON()调用 res.render('profile', {student: student.toJSON(), session: req.session}); });
步骤2:修正Handlebars模板语法
去掉属性访问路径中多余的点号和引号,以下是正确的读取示例:
单个属性读取
<!-- 读取学生姓名 --> <p>学生姓名:{{student.student_name}}</p> <!-- 读取第一条行为记录的ID --> <p>首条行为ID:{{student.Behaviors.[0].behavior_id}}</p> <!-- 读取第一条行为记录的名称 --> <p>首条行为名称:{{student.Behaviors.[0].behavior_name}}</p> <!-- 读取关联表StudentBehavior的属性 --> <p>关联记录学生ID:{{student.Behaviors.[0].StudentBehavior.student_id}}</p>
遍历所有行为记录
如果要展示该学生的所有行为,直接使用 each 循环即可:
<ul> {{#each student.Behaviors}} <li> 行为ID:{{behavior_id}},行为名称:{{behavior_name}} <br> 关联记录学生ID:{{StudentBehavior.student_id}} </li> {{/each}} </ul>
内容的提问来源于stack exchange,提问作者Gianni Fontanot
相关产品推荐
相关产品推荐

