从Node.js多次调用Web服务

我正在构build一个原型Web应用程序,它响应具有查询参数的GET请求,并且调用3个不同的Web服务,所有Web服务都有不同的有效负载 – 2是ReST(一个返回二进制对象,一个图像,一个返回JSON),1是SOAP。

然后,我需要将这些数据中的每一个汇编到为原始GET请求返回的HTML页面中。

我是新来的asynchronous编程,我认为这是我出错的地方。

对于我使用的SOAP

var locationRequest = require('request'); locationRequest(options1, function (error, response, output) { ... } 

对于ReST调用,我使用了两个类似的调用:

  var resourceJSON; var body2; var resourceHttp = require("https"); var resourceRequest = resourceHttp.request(resourceOptions, function (resourceRes) { var chunks2 = []; resourceRes.on("data", function (chunk2) { body2 += chunk2; }); resourceRes.on("end", function () { resourceJSON = JSON.parse(body2); }); resourceRes.on('error', function (error) { console.log('\n Error received: ' + error); }); resourceRequest.end(); }); 

这些都发生在一个快速app.get即

 app.get('/myURL', function(req,res,next){ } 

因此,我需要做的最后一件事是组装这些响应,并返回一些包含数据的HTML给调用者。
首先,我有一些(菜鸟,我敢肯定)怪异的变化范围。 例如,如果我在app.get块的开头定义了一个variables来保存来自ReST调用的JSON,然后在resourceRes.on(“data …)函数中写入它,我得到一个消息,如果我在app.et块的末尾引用它,则不确定。

其次,由于这些调用都是asynchronous的,所以在将数据组装到我的HTML响应之前,如何确定所有调用已经完成?

任何指导或帮助非常感谢!

编辑

所以我已经剥离了这一点,尽可能简单,因为我得到一个问题,当我提交来自浏览器的请求,踢的过程中,浏览器只是等待“等待本地”,然后最终套接字超时错误失败。 如果我通过Postman提交请求,我会按预期得到JSON响应。 任何线索?

代码现在看起来像这样:

 app.get('/myurl', function(req,res,next){ var device = req.query.deviceId; var resourceOptions = { "method": "GET", "hostname": "myhostname", "port": 443, "path": "/mypath/", "headers": { "authorization": "Basic HIDINGTHIS", "cache-control": "no-cache", "content-type": "application/json", } }; const resourceHttp = require("https"); const restRequest = () => { const promise = new Promise((resolve, reject) => { resourceHttp.request(resourceOptions, function (resourceRes) { var response = ''; resourceRes.on("data", function (chunk2) { console.info('in on'); response += chunk2; }); resourceRes.on("end", function () { console.info('in end'); resolve(JSON.parse(response)); }); resourceRes.on('error', function (error) { console.info("in error"); reject(error); }); resourceRequest.end(); }); }); return promise; }; return restRequest() .then(data => { // Send positive response from server console.info("succcess"); res.end("DONE!"); }) .catch(err => { // Send negative response from server as there is an error console.info("error"); res.end("ERROR!"); }); }); 

你可以将它们包装在一个Promise ,然后使用Promise.all()在所有返回的代码中运行代码:

 app.get('/myURL', function(req, res, next){ var soapPromise = new Promise(function(resolve, reject) { locationRequest(options1, function(error, response, output) { if (error) reject(error); else resolve(response); }) }); var restPromise = new Promise(function(resolve, reject) { resourceHttp.request(resourceOptions, function(resourceRes) { var body = ''; resourceRes.on("data", function (chunk) { body += chunk; }); resourceRes.on("end", function () { resolve(JSON.parse(body)); }); resourceRes.on('error', function (error) { console.log('\n Error received: ' + error); reject(error); }); resourceRequest.end(); }); }); Promise.all([soapPromise, restPromise]) .then(function([soapResult, restResult]) { //respond to client }) .catch(function(error) { //catch an error generated from either request }) }) 

您可以使用promise, .catch().catch() ,如下所示:

  const locationRequest = require('request'); const resourceHttp = require("https"); const soapRequest = () => { const promise = new Promise((resolve, reject) => { locationRequest(options1, function (error, response, output) { if(error) reject(error); else resolve(response); }); }); return promise; }; const restRequest = () => { const promise = new Promise((resolve, reject) => { resourceHttp.request(resourceOptions, function (resourceRes) { var response = ''; resourceRes.on("data", function (chunk2) { response += chunk2; }); resourceRes.on("end", function () { resolve(JSON.parse(response)); }); resourceRes.on('error', function (error) { reject(error); }); resourceRequest.end(); }); }); return promise; }; return soapRequest() .then(restRequest) .then(data => { // Send positive response from server }) .catch(err => { // Send negative response from server as there is an error });