Javascript 从Node.js多次调用web服务
我正在构建一个原型web应用程序,它响应带有查询参数的GET请求,启动并调用3个不同的web服务,所有这些服务都具有不同的有效负载—2个是ReST(一个返回二进制对象、一个图像、一个返回JSON),1个是SOAP 然后,我需要将这些数据组合成一个HTML页面,返回原始GET请求 我不熟悉异步编程,我认为这就是我的错误所在 我用的肥皂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
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)响应