【问题标题】:displaying values from sequelize query using handlebars使用把手显示来自 sequelize 查询的值
【发布时间】: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”的值? 谢谢

【问题讨论】:

    标签: handlebars.js sequelize.js


    【解决方案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}}
        

        【讨论】:

          猜你喜欢
          • 2017-05-18
          • 2015-03-29
          • 2021-02-22
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 1970-01-01
          • 2019-07-29
          • 1970-01-01
          相关资源
          最近更新 更多