2017-01-31 6 views
0

Я создаю API Node.js с помощью TypeScript, который я хочу разместить в Azure Functions. Он отправляет запросы другому публичному API. Я получил его для работы, но у него есть ошибка, которую я не могу решить. Я отправляю HTTP-запрос на свой API с Postman. В теле запроса есть объект JSON с одним свойством «id».Azure Функции, http request получает второе последнее значение назад

Но я не получаю последнее значение назад в качестве ответа. Я получаю второе последнее значение в качестве ответа. Предположим, что первый запрос с идентификатором «1» получает «хороший» ответ. Второй запрос с идентификатором «2» также получает «хороший» ответ. Но он должен быть «плохим» в качестве ответа. Третий запрос с идентификатором «3» получает как «плохой» ответ, но он должен «хорошо». Четвертый запрос с идентификатором «4» получает «хороший» ответ, но он должен «плохо».

Проблема только в моем API. Когда я отправляю запросы непосредственно на другой API через почтовый сервер, я не получаю эту проблему.

index.js

module.exports = function (context, req) { 

if (req.body.checkID) { 
    api.validationStatus(req.body.checkID) 
    .then(function (resp) { 
     if (resp.validated) { // Number is correct 
      context.log('Result: good');  
      res = { body: "Result: good" }    
     } 
     else if (resp.name === "StatusCodeError") { // Number is not correct 
      context.log('Result: bad ' + resp.name); 
      res = { body: "Result: bad " + resp.name } 
     } 
     else if (resp.name === "RequestError") { // API is not reachable 
      context.log('Result, bad ' + resp.name); 
      res = { body: "Result, bad " + resp.name } 
     } 
     else { // Something else went wrong 
      context.log("Result, bad."); 
      res = { body: "Result: bad." } 
     } 
    }); 
} 
else { 
    res = { 
     status: 400, 
     body: "Please pass an id" 
    }; 
} 

context.done(null, res);}; 

api.js

myApi.prototype.validationStatus = function (id) { 
    // Request options 
    var options = { 
     method: 'get', 
     url: this.config.validationStatusLocationUrl.replace("{id}", id), 
     headers: { "Authorization": this.config.apiKey } 
    }; 
    // Request with a promise 
    return reqpromise(options) 
     .then(function (res) { 
     return JSON.parse(res); 
    }) 
     .catch(function (err) { 
     return err; 
    }); 
}; 

ответ

0

я получил его. Решение простое, и я предполагаю, что знаю, почему у него такое поведение. Контекст.done(); должен выполняться в .then-разделе обещания (в разделе if и else). Проблема заключалась в том, что я отправлял ответ, даже когда текущий запрос api (api.validationStatus()) еще не был завершен (асинхронный, циклический стиль), и поэтому я получил только старое значение предыдущих запросов.

index.js

module.exports = function (context, req) { 

    if (req.body.checkID) { 

     api.validationStatus(req.body.checkID) 
     .then(function (resp) { 
      if (resp.validated) { // Number is correct 
       context.log('Result, good.');  
       context.res = { body: "Result, good." }  
      } 
      else if (resp.name === "StatusCodeError") { // Number is not correct 
       context.log('Result, bad: ' + resp.name); 
       context.res = { body: "Result, bad." + resp.name } 
       context.done(); 
      } 
      else if (resp.name === "RequestError") { // API is not reachable 
       context.log('Result, bad: ' + resp.name); 
       context.res = { body: "Result, bad." + resp.name } 
       context.done(); 
      } 
      else { // Something else went wrong 
       context.log("Result, bad."); 
       context.res = { body: "Result, bad." } 
       context.done(); 
      } 
      context.done(); 
     }); 
    } 
    else { 
     context.res = { 
      status: 400, 
      body: "Please pass an id" 
     }; 
     context.done(); 
    } 
};