Как перебрать два или более объектов JSON, которые пришли из запросов в шаблоне Jade? - PullRequest
0 голосов
/ 26 января 2020

У меня возникла проблема при получении результатов от запросов API REST, которые возвращают JSON объектов.

Как получить результаты в шаблоне Jade?

if team
   each member in team[0].members
     .team-member
        h4= member.name

Как формат данных для этого объекта?

{
    "team": [
        {
            "_id": "5e22f66a77011b3350a3285f",
            "members": [
                {
                    "_id": "5e264e4897534916ad8594a1",
                    "email": "email@server.com",
                    "name": "name",
                    "role": "Project Manager",
                    "twitter": "https://twitter.com/",
                    "facebook": "https://www.facebook.com/",
                    "linkedin": "https://www.linkedin.com/in//"
                }
            ]
        }
    ]
}

Это работает нормально, но мне нужно более одного запроса. То есть существует более одного объекта JSON.

Итак, у меня есть два запроса для вызова в одном контроллере, каждый из которых возвращает объект JSON. Я реализовал подход, который использует обещания, так что я могу ждать запросов до конца sh, и после этого я могу сохранить выходные данные каждого запроса в массиве, чтобы я мог выполнить только один раз.

Как отобразить данные?

       for (var i = 0; i < results.length; i++) {

            res.render('index', results[i]); // I cannot do it!

        }

Я не могу этого сделать, потому что получаю какую-то ошибку в отношении заголовков, отправленных более одного раза: она возвращает ошибку вида => ERR_HTTP_HEADERS_SENT

Как выполнить рендеринг без ошибок для заголовков?

        var output = [];
        for (var i = 0; i < results.length; i++) {

            output.push(results[i]);
            //res.render('index', results[i]);

        }

        res.render('index', output);

Но теперь я не могу получить доступ к структуре "team" и "member" в JSON объекте.

Как бы я повторил это?

== РЕДАКТИРОВАТЬ ==

Получив несколько ответов, я думаю, что должен поделиться более подробной информацией о коде. Это выглядит следующим образом:

   var url = ApiConfiguration.getApiURL();
    var requests = [{
            url: url + '/api/team/members/',
            headers: {'headers': 'apitoken'}},
        {
            url: url + '/api/service/',
            headers: {'headers': 'apitoken'}}
    ];

    Promise.map(requests, function (obj) {
        return request(obj).then(function (body) {
            return JSON.parse(body);
        });
    }).then(function (results) {

        var output = [];
        for (var i = 0; i < results.length; i++) {

            output.push(results[i]);
            //res.render('index', results[i]);

        }

        res.render('index', output);

    }, function (err) {
        if (err)
            console.log(err);
    });

Ответы [ 2 ]

0 голосов
/ 26 января 2020

?‍? Вы можете сделать что-то вроде этого кода ниже ?:

var url = ApiConfiguration.getApiURL();
var requests = [{
    url: url + '/api/team/members/',
    headers: {
        'headers': 'apitoken'
    }
}, {
    url: url + '/api/service/',
    headers: {
        'headers': 'apitoken'
    }
}];

// I'm using Promise.map from 'bluebird'.
// make sure it's same
Promise.map(requests, function(obj) {
    return new Promise((resolve, reject) => {
        // I'm using request from: https://www.npmjs.com/package/request
        // make sure you too
        request(obj, function(err, res, body) {
            if (err) return reject(err);
            return resolve(JSON.parse(body));
        })
    })
}).then(function(results) {
    const members = [];
    results.map(result => {
        if (result && result.team && result.team.length > 0) {
            result.team.forEach(team => {
                members = [...members, ...team.members]
            })
        }
    });

    res.render('index', members);

}).catch(ex => {
    console.log(ex.message);
    console.log(ex);
})

И теперь, в вашем .jade, вы можете сделать что-то вроде этого кода ниже ?:

doctype html
html
    head
        title=title
    body
        h1 This page is produced by Jade engine
        p some paragraph here..
        if members
        each member in members
          .team-member
              h4= member.name

Надеюсь, это тебе поможет ?.

0 голосов
/ 26 января 2020

Вы можете объединить ответы в один объект и отправить его в Jade:

let output = {};
for (let i = 0; i < results.length; i++) {
  output = { ...output, ...results[i] };
}
res.render('index', output);
...