0

我在从返回 JSON 对象的 REST api 请求中获取结果时遇到问题。

我如何在翡翠模板中获得结果?

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//"
                }
            ]
        }
    ]
}

这工作正常,但我需要多个请求。也就是说,有不止一个 JSONs 对象。

所以,我有两个请求在同一个控制器中调用,每个请求都返回一个 JSON 对象。我已经实现了一种使用承诺的方法,这样我就可以等待请求完成,然后我可以将每个请求的输出存储在一个数组中,这样我就只能渲染一次。

如何渲染数据?

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

但现在我无法访问 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);
    });
4

2 回答 2

0

您可以将响应合并到一个对象中并将其发送到玉:

let output = {};
for (let i = 0; i < results.length; i++) {
  output = { ...output, ...results[i] };
}
res.render('index', output);
于 2020-01-25T23:49:37.443 回答
0

‍你可以在下面做这样的代码:

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

我希望它可以帮助你。

于 2020-01-25T23:52:52.917 回答