Как исправить нулевой ответ на запрос cffi, когда в дескрипторе используется функция putObject s3 - PullRequest
0 голосов
/ 16 мая 2019

Я делаю счетчик, который подсчитывает, сколько раз запрос CFFI вызывается в навыке alexa. Я делаю это, читая и обновляя файл в Amazon S3 внутри дескриптора, где обрабатывается CFFI. CFFI один работает отлично. CFFI с прочитанным кодом файла работает нормально. CFFI с кодом записи файла записывает в файл, но возвращает нулевой ответ на вызов.

Я пробовал асинхронное ожидание обещания. Я увеличил выделенную память функции.

  canHandle(handlerInput) {
    return (handlerInput.requestEnvelope.request.type === 'CanFulfillIntentRequest'
        && (
            handlerInput.requestEnvelope.request.intent.name === 'ProductIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'WhichToothpasteIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'WhiteTeethIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'ToothbrushIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'BrushingTimeIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'BrushingWayIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'DentistVisitIntent' ||
            handlerInput.requestEnvelope.request.intent.name === 'ElectricToothbrushIntent'
            ));
  },
  async handle(handlerInput) {

    var s3 = new AWS.S3();
    var params = { Bucket: "toothpaste-counter", Key: "calls.json" };
    var datum;
    var datum2={
      "name": "CFFI5",
      "calls": 5
      };
    ///*JSON.parse(

    await s3.getObject(params, function (err, data) {
      if (!err) 
          datum = JSON.parse(data.Body.toString());
      else
          datum = err;
      //context.succeed();
    }).promise();

    datum.calls++;

    var params2 = { Bucket: "toothpaste-counter", Key: "calls.json", Body: Buffer.from(JSON.stringify(datum)) };

    await s3.putObject(params2, function (err, data) {
      if (!err) 
          datum = JSON.parse(data.Body.toString());
      else
          datum = err;
      //context.succeed();
    }).promise();

    return handlerInput.responseBuilder
      .withCanFulfillIntent(
        {
          "canFulfill": "YES",
          "slots":{
              "voiceExpert": {
                  "canUnderstand": "YES",
                  "canFulfill": "YES"
                }
            }
        })
        .getResponse();
  },
};

Я ожидаю вывод json, как показано в коде в ответе на вызов, но я получаю нулевое значение.

ожидаемый результат

                "body": {
                    "version": "1.0",
                    "response": {
                        "canFulfillIntent": {
                            "canFulfill": "YES",
                            "slots": {
                                "voiceExpert": {
                                    "canUnderstand": "YES",
                                    "canFulfill": "YES"
                                }
                            }
                        }
                    },
                    "userAgent": "ask-node/2.5.2 Node/v8.10.0",
                    "sessionAttributes": {}
                }
            },

вывод я получаю "invocationResponse": null,

...