路由节点/表达式中的嵌套API请求

时间:2018-06-28 02:40:05

标签: javascript api express

我对编码非常陌生,这是我在这里的第一篇文章。我的学习项目是一个网站,该网站使用外部CRM存储来自Web表单的客户数据。

我的存储部分工作正常,但是无法弄清楚如何检索数据并将其传递给呈现的页面。 我需要一条路线来执行3个操作,每个操作本身都能正常工作,我只是想不出如何嵌套它们以便它们按顺序发生。

  1. 从CRM中获取交易的详细信息
var options = { method: 'GET',
                    url: 'https://crm.com/dev/api/opportunity/' + req.params.id,
                    headers: 
                        { 'cache-control': 'no-cache',
                         'content-type': 'application/json',
                          accept: 'application/json',
                          authorization: 'Basic xxx' },
                          json: true };
            request(options, function (error, response, body) {
                if (error) throw new Error(error);
                    return body.contact_ids;
            });

这将返回与交易相关的客户编号数组。

  1. 遍历客户端编号以从每个客户端中查找数据,并将其放入数组。我在函数范围之外定义了一个名为data的空数组,以捕获结果。

         resultFromAboveRequest.forEach(function(id) {               
            var options = { method: 'GET',
                 url: 'https://crm.com/dev/api/contacts/' + Number(id),
                 headers: 
                  { 'cache-control': 'no-cache',
                     'content-type': 'application/json',
                     accept: 'application/json',
                     authorization: 'Basicxxx' },
                    json: true };
    
             request(options, function (error, response, body) {
    
                if (error) throw new Error(error);
                data.push(body);
            });
        });
    
  2. 将结果数据数组呈现在页面上

    res.render("./applicants/resume", {data: data});

我很确定这是对诺言的工作,但是我似乎无法理解语法。任何帮助将不胜感激,对于这个问题的格式是业余的还是某种程度上的不当,我深表歉意。

1 个答案:

答案 0 :(得分:0)

我建议使用workoutExercises库(这是request-promise库的Promise接口),然后使用Promise在一系列异步操作中管理排序和错误处理。您可以这样做:

request

以下是步骤的一般说明:

  1. 加载请求承诺库。它不会返回完成回调,而是返回一个由响应主体解决的承诺,或者在出现错误时被拒绝的承诺。
  2. 发出第一个请求。
  3. 对返回的诺言使用const rp = require('request-promise'); const options = { method: 'GET', url: 'https://crm.com/dev/api/opportunity/' + req.params.id, headers: { 'cache-control': 'no-cache', 'content-type': 'application/json', accept: 'application/json', authorization: 'Basic xxx' }, json: true }; rp(options).then(body => { return Promise.all(body.contact_ids.map(id => { const options = { method: 'GET', url: 'https://crm.com/dev/api/contacts/' + Number(id), headers: { 'cache-control': 'no-cache', 'content-type': 'application/json', accept: 'application/json', authorization: 'Basicxxx' }, json: true }; return rp(options); })); }).then(data => { res.render("./applicants/resume", {data: data}) }).catch(err => { console.log(err); res.status(500).send("internal server error"); }); 处理程序以获取结果。
  4. 使用.then()处理结果。
  5. .map()回调中,从调用中为每个数据项返回另一个promise。这意味着.map()将返回一个promise数组。
  6. 在该诺言数组上使用.map(),以了解它们何时完成。
  7. Promise.all()返回承诺,以便将其链接到先前的Promise.all()处理程序进行排序。
  8. 然后,在另一个.then()处理程序中(直到之前的两个操作都完成后才会调用),您将以适当的顺序从.then()操作中获取数据,可以使用呼叫.map()
  9. 最后,添加一个res.render()来捕获Promise链中的任何错误(那里的所有错误都将传播到此.catch(),您可以在其中发送错误响应)。