【问题标题】:Iterating unknown JSON in Pug/Jade在 Pug/Jade 中迭代未知 JSON
【发布时间】:2017-02-17 16:59:41
【问题描述】:

我正在使用 node/express 构建我的第一个 api,并尝试创建一个简单的 Jade 视图,该视图将在一堆不同的模型中呈现 JSON,所以我不想为每个模型创建不同的视图我有的模型。我只想遍历任何响应并在表格中吐出结果。是否有通用版本可以做到这一点?

这是我的快递文件中的内容:

/*  Post a STATE and send to update.jade view*/

router.post('/', function(req, res, next) { 
    State.build(req.body).save()
        .then(function(State){
            res.render("update", {
                title: "States Post",
                data: State
            });

        })
});

/*  GET all STATES and send to a update.jade view */

router.get('/', function(req, res, next) {
    State.findAll().then(function(States){
        res.render("update", {
            title: "States Get All",
            data: States
        });
    })
});

这是我目前在翡翠视图中的内容:

extends layout
block content
    h1= title
    table
        each value, index in data
            tr
                td= index
                td= value

作为 get 调用的结果,我有:

States Get All

0   [object SequelizeInstance:State]

对于帖子,它会吐出来:

States Post

dataValues  [object Object]
_previousDataValues [object Object]
_changed    [object Object]
$modelOptions   [object Object]
$options    [object Object]
hasPrimaryKeys  true
__eagerlyLoadedAssociations 
isNewRecord false
_customGetters  [object Object]
_customSetters  [object Object]
validators  [object Object]

(etc. it goes on...)

非常感谢任何帮助。如果有帮助,我将存储在 Postgres 数据库中并使用 Sequelize。

【问题讨论】:

    标签: node.js express iteration pug sequelize.js


    【解决方案1】:

    您可以在 sequelize 模型的每个实例上使用 toJSON() 方法,这将返回一个带有 key : value 对的 javascript 对象,其中每个 key 是先前定义的 sequelize 模型的一个属性

    router.post('/', function(req, res, next) { 
        State.build(req.body).save()
            .then(function(State){
                res.render("update", {
                    title: "States Post",
                    data: State.toJSON() // will return simple object
                });
    
            })
    });
    
    router.get('/', function(req, res, next) {
        State.findAll().then(function(States){
            res.render("update", {
                title: "States Get All",
                data: return States.map((state) => { return state.toJSON(); }); // this will create an array of simple objects
            });
        })
    });
    

    编辑

    您也可以在findAll() 方法中使用{ raw: true }。这将导致不创建任何模型实例。它只会从数据库中返回指定的列而不进行任何格式化。

    如果为真,sequelize 将不会尝试格式化查询结果,或从结果构建模型实例

    【讨论】:

    • 谢谢!这正是我所需要的——简单而有效。
    【解决方案2】:

    如果您只需要显示原始 json 代码,您可以执行以下操作:

    block content code=JSON.stringify(data, null, 2)

    如果迭代本身很重要,比如如果您需要对 json 数据中的每个元素执行某些操作,您可以使用递归 mixin 实现数据遍历(我在这里实现的是一个列表,但您可以想象以某种方式对表格做类似的事情):

    mixin traverse(data)
      if Array.isArray(data)
        ul
          each value in data
            li
              +traverse(value)
      else if typeof data === 'object'
        dl
          each value, index in data
            dt=index
            dd
              +traverse(value)
      else
        span=data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2015-02-15
      • 2012-09-29
      • 2018-09-20
      • 1970-01-01
      • 2019-03-10
      • 2016-12-10
      相关资源
      最近更新 更多