【问题标题】:Promise not executing when wrapped in a function包装在函数中时不执行承诺
【发布时间】:2019-07-29 15:40:27
【问题描述】:

我是 NodeJS 的新手,我正在尝试从 lambda 向 AWS SNS 发布消息。我从 AWS 代码示例中获取了代码,它在 lambda 中运行良好。 但是当我将相同的代码包装在一个函数中并从主处理程序调用时,它不起作用..

我尝试返回并解决承诺,但没有任何效果。



// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region

exports.handler = async (event, context) => {
    saveToSNS();
};

function saveToSNS()  {
    console.log("sdsdsd");
    var AWS = require('aws-sdk');
    var params = {
      Message: 'MESSAGE_TEXT', /* required */
      TopicArn: '<MY TOPIC>'
    };

    // Create promise and SNS service object
    var publishTextPromise = new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise();

    // Handle promise's fulfilled/rejected states

    return publishTextPromise.then(
      function(data) {
          console.log("sdsdsd");
        console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
        console.log("MessageID is " + data.MessageId);
      }).catch(
        function(err) {
        console.error(err, err.stack);
      });

}

【问题讨论】:

  • 我能够通过从处理程序中删除 async keyworkd 来解决此问题。有人可以解释当 async keywrd 出现时发生了什么吗?
  • 我认为,您需要在处理程序中为saveToSNS () 调用添加return 语句。我的意思是exports.handler = async (event, context) =&gt; { return saveToSNS(); };

标签: node.js amazon-web-services aws-lambda amazon-sns


【解决方案1】:

您还需要将所有代码放在处理程序中。你可以这样尝试:

exports.handler = async (event, context) => {

    // Load the AWS SDK for Node.js
    var AWS = require('aws-sdk');
    // Set region
    AWS.config.update({region: 'REGION'});

    saveToSNS();

    function saveToSNS()  {

        // Create publish parameters
        var params = {
            Message: 'MESSAGE_TEXT', /* required */
            TopicArn: 'TOPIC_ARN'
        };

        // Create promise and SNS service object
        var publishTextPromise = new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise();


        publishTextPromise.then(function(data) {
            console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
            console.log("MessageID is " + data.MessageId);
        }).catch(function(err) {
            console.error(err, err.stack);
        });

    }

};

【讨论】:

    【解决方案2】:

    您可以像这样使用 async/await:

    // Load the AWS SDK for Node.js
    var AWS = require('aws-sdk');
    // Set region
    
    exports.handler = async (event, context) => {
        await saveToSNS();
    };
    
    async function saveToSNS()  {
        console.log("sdsdsd");
        var AWS = require('aws-sdk');
        var params = {
          Message: 'MESSAGE_TEXT', /* required */
          TopicArn: '<MY TOPIC>'
        };
    
        // Create promise and SNS service object
        var publishTextPromise = new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise();
    
        // Handle promise's fulfilled/rejected states
    
        return publishTextPromise.then(
          function(data) {
              console.log("sdsdsd");
            console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
            console.log("MessageID is " + data.MessageId);
          }).catch(
            function(err) {
            console.error(err, err.stack);
          });
    
    }
    

    或者在调用 saveToSNS() 函数之前添加 return 语句,像这样:

    exports.handler = async (event, context) => {
        return saveToSNS();
    };
    

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2017-09-23
      • 2017-12-01
      • 1970-01-01
      • 2021-09-15
      • 2020-03-27
      相关资源
      最近更新 更多