2 votes

AWS Lambda fonction node-soap (cadre de travail serverless)

Je teste un appel à un service SOAP en utilisant la bibliothèque node-soap. Cela fonctionne bien en tant qu'application node.js autonome et le service SOAP répond, cependant lorsque j'empaquette le même code en tant que fonction lambda AWS serverless (en utilisant le framework serverless, mais aussi exécuté directement dans AWS lambda), il semble ne pas créer le client soap.

Des idées sur la raison pour laquelle cela pourrait se produire?

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) {
        //la fonction lambda AWS serverless n'atteint jamais ce point (déployée et invoquée localement)

        console.log("Dans la création du client")
        if (err) console.log(err);
        client.addSoapHeader(soapHeader);
        client.GetToken(params, function (err, data) {
            console.log(data);
        });
    });
}

0voto

Thales Minussi Points 5277

J'ai créé un exemple de travail très minimal en utilisant async/await. Plutôt que d'utiliser l'approche de rappel de style ancien, invoquez simplement soap.createClientAsync(url).

Voici le code :

'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: 'Cela fonctionne!'
    }
}

Et voici les journaux (partiellement) :

entrer la description de l'image ici

ÉDITER : Sortie de la fonction (via la console Lambda d'AWS)

entrer la description de l'image ici

ÉDITER 2 - Le VRAI problème

Vérifiez le lien ci-dessus concernant async/await. Le mot-clé async s'exécutera de manière asynchrone et renverra une Promise. Comme c'est une fonction asynchrone, votre Lambda est terminée avant qu'elle ait pu exécuter réellement votre rappel.

Utiliser async/await rendra votre code plus simple et vous évitera de vous casser la tête pour quelque chose d'aussi simple que cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X