在Pug / Jade中迭代未知的JSON

时间:2017-02-17 01:41:51

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

我正在使用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

作为接听电话的结果我有:

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,如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

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

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
        });
    })
});

修改

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

  

如果为true,则sequelize不会尝试格式化查询结果,也不会从结果中构建模型实例

答案 1 :(得分:0)

如果您只需显示原始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