我是一名编程初学者,目前正在开发一个网站项目:一个用户可以撰写和发布文章的基本项目。 在用户帐户页面上,我想显示用户撰写的文章的历史记录。为此,我使用了sequelize 和handlebars,但问题是我的页面显示用户名,而不是历史记录部分中的文章标题。 所以我想知道你是否能解决我的问题。
在我的控制器中,我参考用户和故事模型来仅获取当前用户编写的故事。然后我对变量进行 res.render 以在我的 hbs 页面中使用它们: 我的控制器:
getAccount: async (req, res) => {
const user = await User.findOne({where: {username: req.session.username}})
const stories = await Story.findAll({
where: {
userId: user.id
}
})
console.log(stories, stories.title);
stories.forEach(story => {console.log(story.title);})
res.render('user_account', { user, stories })
}
我的页面:
<div class="user-title">
<h1>Hello {{username}} </h1>
</div>
<div class="storyList-pannel">
<h2>History</h2>
<div class="articles-pannel">
{{#each stories}}
<div class="article-title">
<h3> {{title}} </h3>
</div>
{{/each}}
在我的控制台中,我看到标题未定义,但当我对变量进行 forEach 循环时,我仍然可以获得它的值,我真的不明白为什么。
您应该尝试将
raw: true
选项传递给查询。根据模型查询文档:
默认情况下,所有查找器方法的结果都是模型类的实例(而不是简单的 JavaScript 对象)。这意味着数据库返回结果后,Sequelize 会自动将所有内容包装在适当的实例对象中。 要禁用此包装并接收普通响应,请将 { raw: true } 作为选项传递给 finder 方法。
有据可查,默认情况下,在 Handlebars >= v4.6.0 中,运行时禁止访问上下文对象的原型属性和方法。通过获取由sequelize返回的原始查询,您的车把模板将可以访问对象属性。 像这样通过:
const stories = await Story.findAll({
where: {
userId: user.id
},
raw: true
});