2017-03-13 11 views
0

を待つので、私はnode.jsとjavascriptを一般的に使い慣れています。私は自分の光を発するアレクサのスマートな技を書こうとしていました。ラムダを使用してamazon awsクラウドでNode.js関数をホストします。 Alexaは、この関数をeventcontextオブジェクトと、結果を設定するために使用するcallbackオブジェクトを渡して呼び出します。しかし、コールバックが設定される前に "main"関数が実行を終了すると、関数は動作せず、結果は "null"になります。だから私は、 "メイン"機能を終了する前に、Web要求が完了するまで何とか待つ必要があると思う。私の現在のコード(切り捨てられた)を添付して、うまくいけば、私が意味することを理解し、これに対する解決策を提案することができます。ありがとうございました!AWS node.jsは関数

EDITは、あなたのコードの前に完了した機能は、通常ご使用の構成に予め設定で、あなたのラムダ関数のタイムアウト設定を増やす必要がありサインです^^

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); 
}; 

答えて

0

をCODEを忘れてしまいました。

タイムアウトを設定して、関数の読み込み時間を長く設定し、コードとWebリクエストを実行するようにしてください。私はデフォルトが10秒だと思うが、これでは十分ではないかもしれない。

希望すると助かります