Node.js+Express中Pug渲染Sequelize查询结果显示实例对象而非值
解决Sequelize实例在Pug中显示
[object SequelizeInstance]的问题 嘿,这个问题我之前也踩过坑!你看到的[object SequelizeInstance:mensages]是因为Sequelize从数据库返回的不是普通JavaScript对象,而是Sequelize模型实例对象——这些实例自带了Sequelize的内部方法和属性,直接在Pug里输出整个实例的话,就会显示这个默认的对象字符串。
下面给你几个实用的解决办法,选适合你的就行:
方法1:查询时直接返回纯JS对象
在findAll方法里添加raw: true选项,让Sequelize跳过模型实例包装,直接返回数据库查询结果的纯JavaScript对象:
app.get('/main', function(req, res) { Posts.findAll({ raw: true }) // 新增raw: true配置 .then(function(posts){ res.render(__dirname + "/home.pug", {posts:posts}); }) });
这时候你的Pug代码不用改,直接循环就能访问具体字段(比如li= val.title,前提是你的Posts表有title字段)。
方法2:在Pug中直接访问实例的字段属性
Sequelize实例允许你直接访问对应的数据库字段,不用额外转换。比如你的Posts模型有content字段,直接在Pug里这么写:
div each val in posts li= val.content // 直接访问实例的字段属性
或者用实例的get()方法更明确地获取字段:
div each val in posts li= val.get('content')
方法3:将实例转成JSON对象
每个Sequelize实例都自带toJSON()方法,能把实例转换成包含所有字段的普通JSON对象。你可以在Pug里这样处理:
div each val in posts - const postData = val.toJSON() li= postData.content
这三种方法都能解决问题,个人推荐方法1,因为它在查询阶段就处理好了,后续模板里不用额外操作,代码更简洁。
内容的提问来源于stack exchange,提问作者Vítor Parenti
相关产品推荐
相关产品推荐

