使用把手显示来自 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(和 sequelize-cli)queryInterface.createTable 在 PostgreSQL 上,PK id 类型为 UUID 和 defaultValue:Se

Sequelize 查询在多对多关系中显示附加数据

快递js + Sequelize和钩子

MySQL 查询 10 个表(Sequelize 或 Raw Query)

将 MySQL 变量与 Sequelize 一起使用