Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Node.js多次调用web服务_Javascript_Node.js_Rest_Asynchronous_Soap - Fatal编程技术网

Javascript 从Node.js多次调用web服务

Javascript 从Node.js多次调用web服务,javascript,node.js,rest,asynchronous,soap,Javascript,Node.js,Rest,Asynchronous,Soap,我正在构建一个原型web应用程序,它响应带有查询参数的GET请求,启动并调用3个不同的web服务,所有这些服务都具有不同的有效负载—2个是ReST(一个返回二进制对象、一个图像、一个返回JSON),1个是SOAP 然后,我需要将这些数据组合成一个HTML页面,返回原始GET请求 我不熟悉异步编程,我认为这就是我的错误所在 我用的肥皂 var locationRequest = require('request'); locationRequest(options1, functi

我正在构建一个原型web应用程序,它响应带有查询参数的GET请求,启动并调用3个不同的web服务,所有这些服务都具有不同的有效负载—2个是ReST(一个返回二进制对象、一个图像、一个返回JSON),1个是SOAP

然后,我需要将这些数据组合成一个HTML页面,返回原始GET请求

我不熟悉异步编程,我认为这就是我的错误所在

我用的肥皂

var locationRequest = require('request');        
locationRequest(options1, function (error, response, output) {
...
}
对于其余的调用,我使用两个类似的调用,如下所示:

    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('/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!");
});     

});
这些都发生在一个Express应用程序中

app.get('/myURL', function(req,res,next){
}
因此,我需要做的最后一件事是组合这些响应,并向调用者返回一些包含数据的HTML。
首先,我有一些(菜鸟,我肯定)奇怪的变化范围。例如,如果我在app.get块的开头定义一个变量来保存ReST调用中的JSON,然后在resourceRes.on(“data…)函数中写入它,那么如果我在app.et块的末尾引用它,就会得到一条消息,表明它是未定义的

其次,由于这些调用都是异步启动的,在将数据组装到HTML响应中之前,如何确定所有调用都已完成

非常感谢任何指导或帮助

编辑

因此,我将其剥离为尽可能简单的内容,因为我遇到了一个问题,即当我从浏览器提交启动进程的请求时,浏览器只是以“等待localhost”等待然后最终由于套接字超时错误而失败。如果我通过邮递员提交请求,我会得到预期的JSON响应。有什么线索吗

代码现在如下所示:

    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('/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、
.then()
.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

    });

谢谢-在Promise.all函数中,您在示例中使用了soapResult和RestreResult。它们是在请求块范围之外定义的变量,然后我在其中填充它们吗?它们是两个承诺解析为的任何东西。因此,在本例中,第一个承诺调用resolve(response),第二个承诺调用resolve(JSON.parse(body))。这意味着它们将存储第一个回调中的响应和第二个回调中的JSON.parse(body)响应