使用把手显示来自 sequelize 查询的值
Posted
技术标签:
【中文标题】使用把手显示来自 sequelize 查询的值【英文标题】:displaying values from sequelize query using handlebars 【发布时间】:2018-04-27 19:05:44 【问题描述】:我有一个带有 product_price 和数量的 Cart 模型。我正在编写一个 sequelize 查询来计算总数为价格 * 数量 这是我的查询
db.Cart.findAll(
attributes: include: [[db.sequelize.condition(db.sequelize.col('cart_quantity'), '*', db.sequelize.col('price')),'tot']]
)
Sequelize documentatoin 说要访问我们使用的 'tot' 的值 instance.get('tot')。 所以在结果中 console.log(item.get('tot') 显示正确的值
.then(函数(dbCart) //我们可以在回调函数中作为参数访问产品
dbCart.forEach(function(item)
console.log(item.get('tot'));
);
var hbsObject =
products: dbCart,
;
res.render("shop/cart", hbsObject);
);
);
现在,当我尝试访问我的 carts.handlebars 文件中的值时 我无法显示或访问“tot”的值 #每个产品 tot 要么 Cart.tot 或 products.tot 或 products.get('tot') 不会产生任何价值 /每个 如何访问和显示车把中“tot”的值? 谢谢
【问题讨论】:
【参考方案1】:据我所知,您只能使用 item.get('tot') 访问查询结果,但由于您无法从车把调用函数,因此您需要解决此问题。一种方法是添加一个仅包装 .get() 函数的把手助手。
const Handlebars = require('handlebars');
Handlebars.registerHelper('sequelizeGet', function(obj, col)
return obj.get(col);
);
在车把模板中访问该助手,例如:
<span>sequelizeGet item 'tot'</span>
【讨论】:
【参考方案2】:试试:
#each users
#dataValues
<p>Username: username</p>
<p>Email: email</p>
/dataValues
/each
或者试试:
#each users
<p>Username: this.dataValues.username</p>
<p>Email: this.dataValues.email</p>
/each
【讨论】:
【参考方案3】:如果您关心尊重 Handlebars 的“无逻辑”理念,并保持模板简洁易读,我编写了一个简单的函数来序列化 Sequelize 结果。
function sqlzToArray (obj)
// collection of model instances, return array
if (Array.isArray(obj))
let ret = []
obj.forEach(el =>
ret.push(el.dataValues)
)
return ret
// single model instance, return object
else
let ret =
// loop through keys to find related models (associations)
let keys = Object.keys(obj.dataValues)
for (let i = 0; i < keys.length; i++)
let value = obj.dataValues[keys[i]]
// serialize related model(s)
if (value && typeof value.dataValues !== 'undefined')
value = sqlzToArray(value)
ret[keys[i]] = value
return ret
然后在您的控制器/路由器中:
import sqlzToArray from '../../lib/functions.mjs'
router.get('/foobar', (req, res) =>
Model.findOne(options).then(result =>
res.render('template.hbs', result: sqlzToArray(result) )
)
)
您可以像访问任何其他对象/数组一样在视图中访问它,使用#each、#if 等:
result.foo result.bar
【讨论】:
以上是关于使用把手显示来自 sequelize 查询的值的主要内容,如果未能解决你的问题,请参考以下文章
sequelize(和 sequelize-cli)queryInterface.createTable 在 PostgreSQL 上,PK id 类型为 UUID 和 defaultValue:Se