1

序文:私は JavaScript を初めて使用します。この質問が驚くほどばかげている場合、それが理由 (の一部) です。

更新を開始

だまされてフラグを立てる前に、私の質問に対する答えを見つけました。try-catchブロックで解決しました。try-catchこの回答はブロックを参照していません。

非同期呼び出しから応答を返すにはどうすればよいですか?

更新終了

Alexa プロジェクトをゼロから作成しようとしています (少なくとも、Amazon のテンプレートは使用しません)。私はアプリの「ガッツ」を書き、自分の機能を でテストしましたchai。いくつかのインテントを接続しようとするまで、物事は順調に進んでいました。

console.logにスローしたステートメントに基づいてインテントが送信されていることがわかりますhelperClassが、戻り値がindex.jsファイルに返されていません。

2 つの質問:

  1. 私は何をいじっていますか?
  2. どうすれば修正できますか?

これ に基づいて、index.jsファイルのヘッダーで何が起こっているかを調べたところ、次のことがわかりました。

var Alexa = require('alexa-app');

だから私は行ってalexa-app、それが を使用しているのを見ました。これはbluebird、私がpromise問題に対処していることを示唆しています。さらに、機能するリクエストを送信すると、ログに次のように表示されました。

preRequest fired
postRequest fired

リクエストが機能しない場合、次のように表示されます。

preRequest fired

Big Nerd Ranch の「Developing Alexa Skills Locally with Node.js」を使用しています。

intentこれが私のindex.jsファイルの問題です:

app.intent('getDaysFromNow', {
  'slots': {
        'INPUTDATE' : 'AMAZON.DATE'
  },
    'utterances': ['{|number of|how many} {days} {until|from|since} {|now|today} {|is|was} {-|INPUTDATE}'] // almost perfect
},
  function(req, res) {
    console.log('app.intent getDaysFromNow fired');
    //get the slot
    var inputDate = req.slot('INPUTDATE');
    var reprompt = 'Ask me how many days until or from a specified date.';
    if (_.isEmpty(inputDate)) {
        console.console.log('app.intent daysFromNow blank request');
      var prompt = 'I didn\'t hear the date you want.';
      res.say(prompt).reprompt(reprompt).shouldEndSession(false);
      return true;
    } else {
        console.log('getDaysFromNow slot is not empty.');
      var dateHelper = new DateHelper();
      dateHelper.getDaysFromNow(inputDate).then(function(daysFromNow) { 
        console.log(daysFromNow);
        res.say(dateHelper.formatDaysFromNowResponse(daysFromNow)).send(); // FIXME
      }).catch(function(err) {
        console.log(err.statusCode);
        var prompt = 'Hmm...I don\'t have a date for that ' + inputDate;
        res.say(prompt).reprompt(reprompt).shouldEndSession(false).send();
      });
      return false;
    }
  }
);

送信されていることはわかっていますが、値が に戻っていませんindex.js。返品に問題があると思います。helperClass.js戻り値が返されない関数は次のとおりですindex.js

    // Takes AMAZON.DATE string as its argument
DateHelper.prototype.getDaysFromNow = function(inputDate) {

    if (isValidDate(inputDate)) {       // validate it
        // if it's valid, run the function
        inputDate = moment(inputDate, "YYYY-MM-DD").startOf('day'); // inputDate starts as a string, recast as a moment here
        // create currentDate moment from current Date()
        var currentDate = moment(new Date()).startOf('day');

        // Calculate daysFromNow here
        var daysFromNow = inputDate.diff(currentDate, 'days');
        console.log("\t" + 'daysFromNow = ' + daysFromNow);

        // ORIGINAL CODE
        // return daysFromNow;

        // EXPERIMENTAL CODE
        return this.daysFromNow.then(
            function(response) {
                return response.body;
            }
        );
    } else {
        // throw an error
        throw new Error("getDaysFromNow(): argument must be valid AMAZON.DATE string");
    }
};

読んでくれてありがとう。あなたの提案を歓迎します。

4

1 に答える 1