В файле serverless.yml как настроить шаблон ответа http по умолчанию? - PullRequest
1 голос
/ 13 февраля 2020

Глядя на документацию здесь https://serverless.com/framework/docs/providers/aws/events/apigateway/#custom -response-templates , кажется, не так много подробностей о настройке этих шаблонов.

Я сейчас ищу удалить тип содержимого application/json по умолчанию, который генерируется при создании ответа интеграции обработчика (на рисунке ниже), и заменить его на text/html. Есть ли определенный синтаксис, как сделать это где-то скрытым? Или этот уровень настройки невозможен в текущей области действия фреймворка?

Вот моя конечная точка, определенная в serverless.yml

events:
      - http:
          method: any
          path: /
          integration: lambda
          request:
            region: ${env:AwsRegion}
          response:
            headers:
              Content-Type: "'text/html'"
            template: $input.path('body')
       - http:
          method: any
          path: /{proxy+}

, которая создает следующую конфигурацию на AWS Api Gateway: Api Gateway Integration Response Mapping

Я попытался изменить спецификацию, как это, как предположение, но он выдал синтаксическую ошибку:

template: 
  text\html: $input.path('body')

1 Ответ

1 голос
/ 14 февраля 2020

Make It Work

Похоже, что на самом деле это не поддерживается фреймворком, но его можно взломать, используя (ab) statusCodes в вашем бессерверном шаблоне.

Перемещение шаблона ответа в соответствии с кодом состояния и предоставление pattern для этого кода состояния завершает то, что, я думаю, вы ищете. Синтаксис:

      - http:
          method: any
          path: /
          integration: lambda
          request:
            region: us-east-1
          response:
            headers:
              Content-Type: "'text/html'"
            statusCodes:
              200:
                pattern: ""
                template:
                  text/html: $input.path('body')

Примечание: должны присутствовать pattern и template.


Это действительно так плохо?

Это в конечном итоге, до вас. Я называю это хаком, потому что:

  • Было бы намного лучше иметь возможность поставить это на уровне response.template, а не на response.statusCodes.200.template.
  • Указание один или несколько statusCodes удаляет набор регулярных выражений лямбда-ошибок по умолчанию, которые вы получаете, когда вы их не указываете.
  • Такое ощущение, что нужно обойти тот факт, что response.template будет принимать только строку, тогда как может (должен?) принять строку или объект (как это делается в statusCodes).

Исправить это?

Код нарушающий , из /lib/plugins/aws/package/compile/events/apiGateway/lib/method/integration.js:

        if (http.response.template) {
          _.merge(integrationResponse.ResponseTemplates, {
            'application/json': http.response.template,
          });
        }

        if (config.template) {
          const template =
            typeof config.template === 'string'
              ? { 'application/json': config.template }
              : config.template;

          _.merge(integrationResponse.ResponseTemplates, template);
        }

Я думаю, чтобы это работало в response.template, код в первом if() должен был бы вести себя больше как код во втором if().

...