2017-05-12 168 views
2

我有一個用Node.js寫成的Lambda函數,可以成功發佈到SNS。 當我在Alexa Lambda函數的Alexa意圖中放入相同的函數時,只有在註釋掉代碼的Alexa部分時纔會執行該函數。從AWS Lambda內部發布到SNS Alexa意圖,Node.js

這是獨立的lambda表達式的作品:

var AWS = require("aws-sdk"); 

exports.handler = function() { 
    var sns = new AWS.SNS(); 
    var params = { 
     Message: "Cheese", 
     Subject: "Test SNS From Lambda", 
     TopicArn: "arn:aws:sns:us-east-1:xxxxxxx:MyTopic" 
    }; 
    sns.publish(params, function(){}); 
}; 

如果我再嘗試把我的Alexa的lambda函數的函數內的SNS代碼,它不執行。其餘的Alexa代碼工作正常,但沒有發佈到SNS。但是,如果我將它的Alexa部分註釋掉,它確實有效。

這是不工作(AWS-SDK包含在文件的頂部,從這個例子省略)代碼:

exports.handler = function(event, context) { 

    var sns = new AWS.SNS(); 
    var params = { 
     Message: "Cheese", 
     Subject: "Test SNS From Lambda", 
     TopicArn: "arn:aws:sns:us-east-1:xxxxxxx:MyTopic" 
    }; 
    sns.publish(params, function(){}); 

    const alexa = Alexa.handler(event, context); 
    alexa.APP_ID = APP_ID; 
    alexa.resources = languageStrings; 
    alexa.registerHandlers(newSessionHandlers, memberModeHandlers); 
    alexa.execute(); 
}; 

如果我註釋掉所有的Alexa的東西在exports.handler函數,SNS發佈工作,但顯然應用程序的其餘部分失敗。

這樣,這將工作:

exports.handler = function(event, context) { 

    var sns = new AWS.SNS(); 
    var params = { 
     Message: "Cheese", 
     Subject: "Test SNS From Lambda", 
     TopicArn: "arn:aws:sns:us-east-1:xxxxxxx:MyTopic" 
    }; 
    sns.publish(params, function(){}); 

    /* 
    const alexa = Alexa.handler(event, context); 
    alexa.APP_ID = APP_ID; 
    // To enable string internationalization (i18n) features, set a resources object. 
    alexa.resources = languageStrings; 
    alexa.registerHandlers(newSessionHandlers, memberModeHandlers); 
    alexa.execute(); 
    */ 
}; 

有什麼想法,什麼是怎麼回事? 理想情況下,我想要做的就是將sns發佈代碼放在一個單獨的函數中,然後我在Alexa技能期間的某個點調用一個意圖調用,但目前爲止我無法使這個函數與Alexa碼。

回答

2

我想我想出了這樣做的正確方法。 在intent裏面我發佈了代碼,並且在publish()函數的回調函數中,我放置了Alexa emit函數。這樣,在繼續完成其餘工作流程之前,應用程序會等待SNS發佈成功完成。 我用這個來發送基於意圖的短信。

這是一個Alexa的意圖內更新的代碼:

'MessageMemberIntent' : function() { 

    var sns = new AWS.SNS(); 
    var message = "test foo"; 
    var params = { 
     Message: message, 
     Subject: "Test SNS From Lambda", 
     TopicArn: "arn:aws:sns:us-east-1:xxxxxx:MyTopic" 
    }; 
    sns.publish(params, (() => { 
     this.emit(':ask', 'Ok, sending the message to the member'); 
    })); 


    } 

這樣就完成了發佈到SNS與提示給用戶,然後再繼續。