How do you structure sequential AWS service calls within lambda given all the calls are asynchronous?

后端 未结 8 567
暗喜
暗喜 2021-02-02 14:35

I\'m coming from a java background so a bit of a newbie on Javascript conventions needed for Lambda.

I\'ve got a lambda function which is meant to do several AWS tasks i

8条回答
  •  日久生厌
    2021-02-02 15:19

    I like the answer from @jonathanbaraldi but I think it would be better if you manage control flow with Promises. The Q library has some convenience functions like nbind which help convert node style callback API's like the aws-sdk into promises.

    So in this example I'll send an email, and then as soon as the email response comes back I'll send a second email. This is essentially what was asked, calling multiple services in sequence. I'm using the then method of promises to manage that in a vertically readable way. Also using catch to handle errors. I think it reads much better just simply nesting callback functions.

    var Q = require('q');
    var AWS = require('aws-sdk');    
    AWS.config.credentials = { "accessKeyId": "AAAA","secretAccessKey": "BBBB"};
    AWS.config.region = 'us-east-1';
    
    // Use a promised version of sendEmail
    var ses = new AWS.SES({apiVersion: '2010-12-01'});
    var sendEmail = Q.nbind(ses.sendEmail, ses);
    
    exports.handler = function(event, context) {
    
        console.log(event.nome);
        console.log(event.email);
        console.log(event.mensagem);
    
        var nome = event.nome;
        var email = event.email;
        var mensagem = event.mensagem;
    
        var to = ['email@company.com.br'];
        var from = 'site@company.com.br';
    
        // Send email
        mensagem = ""+nome+"||"+email+"||"+mensagem+"";
    
        console.log(mensagem);
    
        var params = { 
            Source: from, 
            Destination: { ToAddresses: to },
            Message: {
            Subject: {
                Data: 'Form contact our Site'
            },
            Body: {
                Text: {
                    Data: mensagem,
                }
            }
        };
    
        // Here is the white-meat of the program right here.
        sendEmail(params)
            .then(sendAnotherEmail)
            .then(success)
            .catch(logErrors);
    
        function sendAnotherEmail(data) {
            console.log("FIRST EMAIL SENT="+data);
    
            // send a second one.
            return sendEmail(params);
        }
    
        function logErrors(err) {
            console.log("ERROR="+err, err.stack);
            context.done();
        }
    
        function success(data) {
            console.log("SECOND EMAIL SENT="+data);
            context.done();
        }
    }
    

提交回复
热议问题