使用sequelize和把手显示模型属性

问题描述 投票:0回答:1

我是一名编程初学者,目前正在开发一个网站项目:一个用户可以撰写和发布文章的基本项目。 在用户帐户页面上,我想显示用户撰写的文章的历史记录。为此,我使用了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 循环时,我仍然可以获得它的值,我真的不明白为什么。

express sequelize.js handlebars.js
1个回答
0
投票

您应该尝试将

raw: true
选项传递给查询。根据模型查询文档

默认情况下,所有查找器方法的结果都是模型类的实例(而不是简单的 JavaScript 对象)。这意味着数据库返回结果后,Sequelize 会自动将所有内容包装在适当的实例对象中。 要禁用此包装并接收普通响应,请将 { raw: true } 作为选项传递给 finder 方法。

有据可查,默认情况下,在 Handlebars >= v4.6.0 中,运行时禁止访问上下文对象的原型属性和方法。通过获取由sequelize返回的原始查询,您的车把模板将可以访问对象属性。 像这样通过:

const stories = await Story.findAll({ where: { userId: user.id }, raw: true });

© www.soinside.com 2019 - 2024. All rights reserved.