2017-03-13 5 views
0

so bin ich ziemlich neu zu node.js und Javascript im Allgemeinen. Ich habe versucht, eine Alexa-Smarthome-Fähigkeit zu schreiben, die mein Licht anschaltet. Ich host meine Node.js-Funktion in der Amazon-Cloud mit Lambda. Alexa ruft diese Funktion auf und übergibt ein event und context Objekt und ein callback Ich sollte verwenden, um das Ergebnis festzulegen. Wenn jedoch die "main" -Funktion ihre Ausführung beendet, bevor der Callback gesetzt ist, funktioniert sie nicht und das Ergebnis ist "null". Um es zum Laufen zu bringen, denke ich, dass ich irgendwie warten muss, bis die Webanfrage abgeschlossen ist, bevor die "Haupt" -Funktion beendet wird. Ich habe meinen aktuellen Code (abgeschnitten) angehängt, damit Sie hoffentlich herausfinden können, was ich meine, und mir eine Lösung dafür vorschlagen. Vielen Dank!AWS node.js warte auf Funktion

EDIT VERGASS CODE ^^

process.env["PATH"] = process.env["PATH"] + ":" + process.env["LAMBDA_TASK_ROOT"]; 

const uuidV4 = require('uuid/v4'); 
var https = require('https'); 

var defaultRGB = {r: 100, g: 100, b: 100}; 

var handlers = { 
    "DiscoverAppliancesRequest": discoverAppliancesRequestHandler, 
    "TurnOnRequest": turnOnRequestHandler, 
    "TurnOffRequest": turnOffRequestHandler 
}; 


function turnOnRequestHandler(event, context, callback) { 
    var header = buildHeader("TurnOnConfirmation", "Alexa.ConnectedHome.Control"); 
    var body = {}; 
    turnOnAllLights(function() { 
     callback(null, {header: header, payload: body}); 
    }); 
} 
function turnOnAllLights(callback) { 
    var options = { 
     host: "home.XXXX.de", 
     port: 9443, 
     path: "/XXX/update/V1", 
     method: "PUT", 
     headers: { 
      "Content-Type": "application/json" 
     } 
    }; 

    var request = https.request(options, function (res) { 
     console.log(res.statusCode); 
     res.on("data", function (chunk) { 
      console.log(chunk); 
      callback(); 
     }).on("error", function (error) { 
      console.error(error); 
      callback(); 
     }) 
    }); 
    request.on("error", function (error) { 
     console.error(error); 
    }); 
    request.write(JSON.stringify([defaultRGB.r, defaultRGB.g, defaultRGB.b])); 
    request.end(); 
} 

function buildHeader(name, namespace) { 
    return { 
     messageId: uuidV4(), 
     name: name, 
     namespace: namespace, 
     payloadVersion: 2 
    }; 
} 

exports.handler = function (event, context, callback) { 
    var name = event.header.name; 
    handlers[name](event, context, callback); 
}; 

Antwort

0

Die Funktion abgeschlossen, bevor Sie den Code in der Regel ein Zeichen dafür ist, müssen Sie die Timeout-Einstellung Ihrer Lambda-Funktion unter den bereits vorgenommenen Einstellungen in der Konfiguration zu erhöhen.

Stellen Sie sicher, dass Sie Ihr Zeitlimit auf mehr als die Länge einstellen, die Sie erwarten, dass Ihre Funktion geladen, Code ausgeführt und eine Webanforderung ausgeführt wird. Ich denke, der Standardwert ist 10 Sek., Was für dich vielleicht nicht ausreicht.

Hoffe es hilft