Функция AWS Lambda node-soap (безсерверный фреймворк) - PullRequest
0 голосов
/ 01 марта 2019

Я тестирую вызов службы SOAP с использованием библиотеки node-soap.Это прекрасно работает как отдельное приложение node.js, и служба SOAP отвечает, однако, когда я упаковываю тот же код, что и безсерверная лямбда-функция AWS (с использованием безсерверной среды, но также выполняется непосредственно в лямбда-режиме AWS), это несоздать мыльный клиент.

Есть мысли о том, почему это может происходить?

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);
        });
    });
}

1 Ответ

0 голосов
/ 01 марта 2019

Я создал очень минимальный рабочий пример, используя 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!'
    }
}

А вот журналы (частично):

enter image description here

EDIT : выход функции (через лямбда-консоль AWS)

enter image description here

РЕДАКТИРОВАТЬ 2 - РЕАЛЬНАЯ проблема

Проверьте ссылку выше вокруг async / await.Ключевое слово async будет выполняться асинхронно и вернет Promise.Поскольку это асинхронная функция, ваша лямбда завершается до того, как она действительно сможет выполнить ваш обратный вызов.

Использование async / await упростит ваш код и позволит вам перестать бить себя мозгами за такую ​​маленькую вещь, как эта.

...