【问题标题】:Why am I unable to start my instances when I use Callback?为什么我在使用回调时无法启动我的实例?
【发布时间】:2017-12-01 19:57:39
【问题描述】:

我对 lambda 函数很陌生,如果这个问题很愚蠢,我深表歉意。 下面代码的第一部分有效,它启动 ec2 实例,但如果我将它链接到 Alexa 则不起作用

var aws = require("aws-sdk");
var https=require('https')

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


    try{

        if (event.session.new) {
    //New Session
    console.log("NEW SESSION")
    }

    switch (event.request.type){  
    case "IntentRequest":
    // > Intent Request
    console.log(`INTENT REQUEST`)
    switch(event.request.intent.name){

    case "StartecInsatnce":
        console.log(`Test msg`)
                             var ec2=new aws.EC2({region: 'us-east-1'});
       var endpoint= ec2.startInstances({InstanceIds: ['i-0a20b89becb6fcb7e']}, function(err,data) {
                                           if (err) console.log(err,err.stack);
                                           else console.log(data);
                                           context.done(err,data);
                                           }); 
                              callback(null, "some success message");                                          


                                           }
                                           break;
       default: 
          context.fail(`INVALID REQUEST TYPE: ${event.request.type}`)
    }
}
catch(error) { context.fail(`EXCEPTION: ${error}`) }

}

所以我使用了下面的代码,虽然发送响应但无法启动 ec2 实例。请帮忙

var aws = require("aws-sdk");
var https=require('https')

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


    try{

        if (event.session.new) {
    //New Session
    console.log("NEW SESSION")
    }

    switch (event.request.type){

    case "IntentRequest":
    // > Intent Request
    console.log(`INTENT REQUEST`)
    switch(event.request.intent.name){

    case "StartecInsatnce":
    onIntent(event.request,
        event.session,
        function callback(sessionAttributes, speechletResponse) {
          context.succeed(buildResponse(sessionAttributes, speechletResponse));
        });


      //      callback(null, "some success message");                                                                             

               }//end of inner switch
                                           break;

    default: 
          context.fail(`INVALID REQUEST TYPE: ${event.request.type}`)        
    }
}
catch(error) { context.fail(`EXCEPTION: ${error}`) }
//Helpers
generateResponse = (sessionAttributes, speechletResponse) => {
return{   
    version: "1.0",
    sessionAttributes: "sessionAttributes",
    response: "speechletResponse"
    }
   }  
}
function onIntent(intentRequest, session, callback) {
    var intent = intentRequest.intent,
    intentName = intentRequest.intent.name;
    var cardTitle = intent.name;
    console.log(`Test msg`)
    var sessionAttributes={}
         var shouldEndSession = false;
    speechOutput = "instance started.";
       var ec2=new aws.EC2({region: 'us-east-1'});  
       var endpoint= ec2.startInstances({InstanceIds: ['i-0a20b89becb6fcb7e']}, function(err,data) {
                                           if (err) console.log(err,err.stack);
                                           else console.log(data);
                                           context.done(err,data);

                                          }); 
                                          console.log("end="+endpoint) 
    callback(sessionAttributes,
    buildSpeechletResponse(cardTitle, speechOutput,  shouldEndSession));

    }

    function buildSpeechletResponse(title, output, shouldEndSession) {
    return {
      outputSpeech: {
        type: "PlainText",
        text: output
      },
      card: {
        type: "Simple",
        title: "SessionSpeechlet - " + title,
        content: "SessionSpeechlet - " + output
      },

      shouldEndSession: shouldEndSession
    };
  }
function buildResponse(sessionAttributes, speechletResponse) {
    return {
      version: "1.0",
      sessionAttributes: sessionAttributes,
      response: speechletResponse
    };
  }

【问题讨论】:

    标签: node.js amazon-ec2 aws-lambda alexa alexa-skills-kit


    【解决方案1】:

    您将异步代码视为同步代码。

    var endpoint= ec2.startInstances({InstanceIds: ['i-0a20b89becb6fcb7e']}, function(err,data) {
                                           if (err) console.log(err,err.stack);
                                           else console.log(data);
                                           context.done(err,data);
                                           }); 
                              callback(null, "some success message");                                          
    

    这段代码有什么作用?

    按顺序:

    • 构建并启动对 ec2.startInstances 的异步请求
    • 立即调用callback()
    • 也许允许 API 请求完成
    • 也许到达context.done()。不清楚你为什么同时使用它和callback(),但也许我忽略了一些东西。

    但您似乎需要从ec2.startInstances 调用延续函数内部的回调,以便它被延迟,而不是在外部,它将在ec2.startInstances 完成之前执行之前,因为您还没有将控制权返回给事件循环。

    【讨论】:

    • 谢谢,我刚刚从 ec2 启动实例中删除了 context.done。你能建议我是否可以编辑 ec2.startInstances 的回调调用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2023-03-25
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多