2017-03-24 8 views
0

私はここで本当に簡単なものを紛失していますが、ここにはあります。alexa-appとのネットワーク上の問題と約束してください

私は今、Alexaの開発を学び始めています。Alexaのプログラミングを本当に簡単にするように見えるalexa-appモジュールが見つかりました。

私はAirportInfoという名前のチームが提供するサンプルアプリケーションを歩いています。問題領域のためのコードは以下の通りです:

ターンでこれらの関数を呼び出す
var faaHelper = new FAADataHelper(); 
faaHelper.requestAirportStatus(airportCode).then(function(airportStatus) { 
    var goodMessage = faaHelper.formatAirportStatus(airportStatus); 
    console.log(goodMessage); 
    res.say(goodMessage).send(); 
}).catch(function(err) { 
    console.log(err.statusCode); 
    var prompt = 'I didn\'t have data for an airport code of ' + airportCode; 
    console.log(prompt); 
    res.say(prompt).reprompt(reprompt).shouldEndSession(false).send(); 
}); 
return false; 

FAADataHelper.prototype.requestAirportStatus = function(airportCode) { 
    return this.getAirportStatus(airportCode).then(
     function(response) { 
      console.log('success - received airport info for ' + airportCode); 
      return response.body; 
     } 
    ); 
}; 
FAADataHelper.prototype.getAirportStatus = function(airportCode) { 
    var options = { 
     method: 'GET', 
     uri: ENDPOINT + airportCode, 
     resolveWithFullResponse: true, 
     json: true 
    }; 
    return rp(options); 
}; 

これは私にはよさそうだが、コードが実行されるとき、メインアレクサ・アプリ「要求」応答がデバイスに返送されたときを制御することにより、予想より早く復帰します。選択された空港の予想天気情報を含む全応答ペイロードの代わりに、return rp(options)呼び出しが行われた直後に応答が返されます。最初のコードサンプルの.then()ブロックで実行されるコードはの後に実行され、のスキルはすでにAlexaに返されます。これは、実際には、スキルのエラーに関する何らかの秘密のメッセージを言うようにAlexaをクラッシュさせます。ここで

は私server.jsコードです:

var AlexaAppServer = require("../index.js"); 
AlexaAppServer.start({ 
    server_root: './', 
    port: 8080, 
    debug: true, 
    // Use preRequest to load user data on each request and add it to the request json. 
    // In reality, this data would come from a db or files, etc. 
    preRequest: function(json, req, res) { 
     console.log("preRequest fired"); 
     json.userDetails = { "name": "Bob Smith" }; 
    }, 
    // Add a dummy attribute to the response 
    postRequest: function(json, req, res) { 
     // look for this output in the log below 
     console.log("postRequest fired"); 
     json.dummy = "text"; 
    } 
}); 

、ここでは、私が説明しています。この状態を示すデバッグログです:preRequest FiredpostRequest Firedsuccess - received airport info for dfwに対して表示

preRequest fired 
REQUEST { method: 'GET', 
    uri: 'http://services.faa.gov/airport/status/dfw', 
    resolveWithFullResponse: true, 
    json: true, 
    simple: false, 
    callback: [Function: RP$callback], 
    transform: undefined, 
    transform2xxOnly: false } 
postRequest fired 
REQUEST make request http://services.faa.gov/airport/status/dfw 
REQUEST onRequestResponse http://services.faa.gov/airport/status/dfw 200 { date: 'Fri, 24 Mar 2017 05:09:41 GMT', 
    server: 'Apache', 

    ... 

    'access-control-allow-origin': '*', 
    'access-control-allow-methods': 'GET, HEAD, OPTIONS', 
    'version-requested': 'Any', 
    connection: 'close', 
    'transfer-encoding': 'chunked', 
    'content-type': 'application/json;charset=UTF-8' } 
REQUEST reading response's body 

... 

REQUEST end event http://services.faa.gov/airport/status/dfw 
REQUEST has body http://services.faa.gov/airport/status/dfw 517 
REQUEST emitting complete http://services.faa.gov/airport/status/dfw 
success - received airport info for dfw 

注意してください。私が間違っていることは何ですか?私のノード環境で何かが間違って設定されているか、またはおそらく悪い依存関係のバージョンですか?私はNodeコマンドプロンプトからデバッガ(VSコード)に失敗し、Lambdaから全く同じであるため、疑わしいです。完全なソースコードに

LINKは:https://github.com/bignerdranch/alexa-airportinfo

答えて

4

私はアレクサに関しての約束についてのすべてを理解していないが、私は、これは考え出し手に入れました。 あなたの質問の日から、新しいバージョンのalexa-app-server(3.0.1)とalexa-app(4.0.0)が利用可能です。私は最近、これらのバージョンを使ってスキルを開発しました。 alexa-airportinfoに記載されているバージョンalexa-app 2は、最新のalexa-app-serverでは動作しません。

まず、コードで最新のalexa-appを使用することです。次に、FAADataHelperでrequest-promiseを使用することによって、コードがPromiseをindex.jsに戻すことを認識しています。これが機能するには、関数の最後にfalseの代わりにそのPromiseを返す必要があります。

要約すると、私は最新のalexa-app-serverを手に入れ、airportinfoのalexa-appバージョンを最新のものに変更して実行し、同じ結果を得ました - 応答はrp要求の前に戻りますされます。コードを下に変更したところ、リクエストが完了し、応答が完了しました。

app.intent('airportinfo', { 
    'slots': { 
    'AIRPORTCODE': 'FAACODES' 
    }, 
    'utterances': ['{|flight|airport} {|delay|status} {|info} {|for} {-|AIRPORTCODE}'] 
}, 
    function(req, res) { 
    //get the slot 
    var airportCode = req.slot('AIRPORTCODE'); 
    var reprompt = 'Tell me an airport code to get delay information.'; 
    if (_.isEmpty(airportCode)) { 
     var prompt = 'I didn\'t hear an airport code. Tell me an airport code.'; 
     res.say(prompt).reprompt(reprompt).shouldEndSession(false); 
     return true; 
    } else { 
     var faaHelper = new FAADataHelper(); 
     return faaHelper.requestAirportStatus(airportCode).then(function(airportStatus) { 
     console.log(airportStatus); 
     res.say(faaHelper.formatAirportStatus(airportStatus)).send(); 
     }).catch(function(err) { 
     console.log(err.statusCode); 
     var prompt = 'I didn\'t have data for an airport code of ' + airportCode; 
     //https://github.com/matt-kruse/alexa-app/blob/master/index.js#L171 
     res.say(prompt).reprompt(reprompt).shouldEndSession(false).send(); 
     }); 
     // return false; 
    } 
    } 
); 
+0

ありがとうございました。これは実際問題でした。私は誤って、すべての問題を引き起こしていた古いバージョンのアプリケーションサーバーを使用していました。助けを感謝します! –

関連する問題