node-soap と pg-promise を使用しているという質問があります。SOAP サービスにリクエストを送信すると応答が遅延するという問題があります。つまり、応答が返される前に (soap ui を使用して) リクエストを 2 回送信する必要があります。
データベース呼び出しからの応答をノードの SOAP コールバックに正しく渡していないかどうか疑問に思っています。
node-soap Web サイトのサンプル コードは次のとおりです。
var myService = {
MyService: {
MyPort: {
MyFunction: function(args) {
return {
name: args.name
};
},
// This is how to define an asynchronous function.
MyAsyncFunction: function(args, callback) {
// do some work
callback({
name: args.name
});
},
// This is how to receive incoming headers
HeadersAwareFunction: function(args, cb, headers) {
return {
name: headers.Token
};
},
// You can also inspect the original `req`
reallyDeatailedFunction: function(args, cb, headers, req) {
console.log('SOAP `reallyDeatailedFunction` request from + req.connection.remoteAddress);
return {
name: headers.Token
};
}
}
}
};
var xml = require('fs').readFileSync('myservice.wsdl', 'utf8'),
server = http.createServer(function(request,response) {
response.end("404: Not Found: " + request.url);
});
これが私のコードです:
var http = require('http');
var soap = require('soap');
global.results = '';
var promise = require('bluebird'); //
var options = {
promiseLib: promise // switch to bluebird lib
};
// Database connection details;
var cn = {
host: '',
port: 5432,
database: '',
user: '',
password: ''
};
var pgp = require('pg-promise')(options);
var db = pgp(cn);
var cancelService = {
cancelService: {
Cancel_PortType: {
getAgreement: function(args,callback,headers) {
var values = {
vin: args.vin
};
db.any("select contract_num as contract, " +
"CASE WHEN sg_con_status='A' THEN 'Active ' " +
"WHEN sg_con_status='X' THEN 'Expired' " +
"WHEN sg_con_status='C' THEN 'Cancelled' " +
"END AS agreementStatus, " +
"tfs_product_type as productType, " +
"vin, cust_first_name as customerFirstName, cust_last_name as customerLastName," +
"TO_CHAR(original_busdate,'YYYY-MM-DD') as purchaseDate, TO_CHAR(expire_date,'YYYY-MM-DD') as expirationDate " +
"from tfs_contract_summary, sg_con_m1 where sg_con_m1.sg_con_contract = tfs_contract_summary.contract_num " +
" AND vin = ${vin}",values)
.then(function(data) {
//set value of DB return to global
global.results = data;
console.log("DATAAAAAAA:", data);
})
.catch(function(error) {
console.log("ERROR:", error); // print the error;
})
.finally(function() {
pgp.end(); //closing the connection pool.
});
// }
callback({
contracts: global.results
});
}
}
}
}
var xml = require('fs').readFileSync('CancelService.wsdl', 'utf8'),
server = http.createServer(function(request, response) {
response.end("404: Not Found: " + request.url)
});
server.listen(8000);
soap.listen(server, '/wsdl', cancelService, xml);
すべての console.log() は、SOAPUI でリクエストを送信するたびに戻ってくるデータを示していますが、リクエストを 2 回送信するまで応答は返されません。
例えば
ボタンを 1 回押す: vin = 12312364812736498
John doe 情報が返されることを期待しています - console.log(John doe's info) SOAP RESPONSE = empty
ボタンを 2 回 押します console.log(John doe's info) SOAP RESPONSE = John doe's info
提供されている SOAP クライアントのサンプル コードを使用してリクエストを発行すると、次のようになります。
console.log は毎回動作します:
global.results 値に競合状態があるというスコープの問題はありますか?
私はNode JSなどの初心者なので、おそらく私のコードに何か問題があると確信しています...
石鹸サーバーのコールバックに間違って渡していますか??
callback({
contracts: global.results
});
どんな洞察も大歓迎です。