AWS Lambda node-soap 函数(无服务器框架)
AWS Lambda node-soap function (serverless framework)
我正在使用 node-soap 库测试对 SOAP 服务的调用。
这作为一个独立的 node.js 应用程序工作正常并且 SOAP 服务响应,但是当我将相同的代码打包为无服务器 AWS lambda 函数时(使用无服务器框架,但也直接在 AWS lambda 中执行),它不会似乎在创建 soap 客户端。
关于为什么会发生这种情况有什么想法吗?
export async function main(event, context) {
var soap = require('soap');
var url = 'https://service.blah.co.uk/Service/Function.asmx?wsdl';
var soapOptions = {
forceSoap12Headers: true
};
var soapHeader = {
'SOAPAction': 'http://www.blah.co.uk/Services/GetToken'
};
var params = {
xmlMessage: message
};
console.log(JSON.stringify(params));
soap.createClient(url, soapOptions, function (err, client) {
//the serverless AWS lambda function never reaches this point (deployed and invoked locally)
console.log("In create client")
if (err) console.log(err);
client.addSoapHeader(soapHeader);
client.GetToken(params, function (err, data) {
console.log(data);
});
});
}
我使用 async/await 创建了一个非常简单的工作示例。而不是使用旧式回调方法,只需调用 soap.createClientAsync(url).
代码如下:
'use strict';
const soap = require('soap');
module.exports.hello = async (event, context) => {
const url = 'http://www.thomas-bayer.com/axis2/services/BLZService?wsdl';
const client = await soap.createClientAsync(url)
console.log(client)
return {
statusCode: 200,
message: 'It works!'
}
}
这是日志(部分):
编辑:函数的输出(通过 AWS 的 Lambda 控制台)
编辑 2 - 真正的问题
检查上面 async/await 周围的 link。 async 关键字将异步执行并将 return 一个 Promise。由于它是一个异步函数,您的 Lambda 在实际执行您的回调之前被终止。
使用 async/await 将使您的代码更简单,并且让您不再为这样的小事绞尽脑汁。
我正在使用 node-soap 库测试对 SOAP 服务的调用。 这作为一个独立的 node.js 应用程序工作正常并且 SOAP 服务响应,但是当我将相同的代码打包为无服务器 AWS lambda 函数时(使用无服务器框架,但也直接在 AWS lambda 中执行),它不会似乎在创建 soap 客户端。
关于为什么会发生这种情况有什么想法吗?
export async function main(event, context) {
var soap = require('soap');
var url = 'https://service.blah.co.uk/Service/Function.asmx?wsdl';
var soapOptions = {
forceSoap12Headers: true
};
var soapHeader = {
'SOAPAction': 'http://www.blah.co.uk/Services/GetToken'
};
var params = {
xmlMessage: message
};
console.log(JSON.stringify(params));
soap.createClient(url, soapOptions, function (err, client) {
//the serverless AWS lambda function never reaches this point (deployed and invoked locally)
console.log("In create client")
if (err) console.log(err);
client.addSoapHeader(soapHeader);
client.GetToken(params, function (err, data) {
console.log(data);
});
});
}
我使用 async/await 创建了一个非常简单的工作示例。而不是使用旧式回调方法,只需调用 soap.createClientAsync(url).
代码如下:
'use strict';
const soap = require('soap');
module.exports.hello = async (event, context) => {
const url = 'http://www.thomas-bayer.com/axis2/services/BLZService?wsdl';
const client = await soap.createClientAsync(url)
console.log(client)
return {
statusCode: 200,
message: 'It works!'
}
}
这是日志(部分):
编辑:函数的输出(通过 AWS 的 Lambda 控制台)
编辑 2 - 真正的问题
检查上面 async/await 周围的 link。 async 关键字将异步执行并将 return 一个 Promise。由于它是一个异步函数,您的 Lambda 在实际执行您的回调之前被终止。
使用 async/await 将使您的代码更简单,并且让您不再为这样的小事绞尽脑汁。