Настройте функцию Firebase для принятия HAL+JSON в качестве тела запроса.

При использовании запускаемых HTTP-функций в Firebase я не могу получить доступ к полезной нагрузке HAL+JSON из HTTP-запроса.

Запрос выглядит так:

POST /endpoint
Content-Type: application/hal+json

{ /* some payload */ }

В моей функции я получаю доступ к полезной нагрузке, используя request.body, например:

...
var myPayload = request.body;
...

Значение myPayload:

{}

Вместо этого, когда HTTP-запрос содержит Content-Type: application/json, значение myPayload является правильным:

{ /* some payload */ }

Я считаю, что это связано со следующим: express.json()

Есть ли способ настроить экспресс в Firebase, чтобы включить application/hal+json? Например:

express.json({
  type: [ 'application/json', 'application/hal+json' ]
});

Или самому получить доступ к необработанному телу?

Примечание. Я не хочу создавать экспресс-приложение внутри функции.


person Ati Ranzuglia    schedule 19.01.2018    source источник


Ответы (1)


Обратитесь к документации, чтобы понять, как Cloud Functions автоматически обрабатывает входящие запросы. .

Облачные функции анализируют типы содержимого тела запроса application/json и application/x-www-form-urlencoded в соответствии с описанными выше правилами. Типы обычного текстового контента (text/plain) передаются в виде строк с использованием UTF-8 в качестве кодировки по умолчанию (или пользовательской кодировки, указанной в заголовке типа контента).

Для других типов содержимого свойство rawBody содержит непроанализированные байты тела запроса в виде объекта Buffer.

Ваш «другой тип контента» здесь, вероятно, означает, что ваше необработанное тело запроса будет доступно из объекта запроса в свойстве rawBody.

person Doug Stevenson    schedule 19.01.2018
comment
Спасибо @ Дуг-Стивенсон. К сожалению, при использовании Content-Type: application/hal+json это не работает: req.rawBody это undefined. Если я попробую Content-Type: text/plain, то req.rawBody будет содержать буфер. Похоже, что параметр парсера req.rawBody отсутствует, когда полезная нагрузка HAL+JSON. - person Ati Ranzuglia; 19.01.2018
comment
Есть ли способ получить доступ к текущему экспресс-приложению и сделать следующее? npmjs.com/package/ - person Ati Ranzuglia; 19.01.2018
comment
Что насчет этого? issuetracker.google.com/issues/36252545 По-видимому, решение, описанное в комментарии № 39, не еще не реализовано. - person Ati Ranzuglia; 19.01.2018
comment
Я не могу воспроизвести. Когда я отправляю данные в простую функцию https, которая регистрирует как body, так и rawBody, и вызываю ее с помощью curl, я вижу оба значения. curl -X POST -H "Content-Type:application/hal+json;charset=UTF-8" -d '{"message":"Hello World!"}' https://us-central1-.../myFunctions - person Doug Stevenson; 20.01.2018
comment
Если вы считаете, что проблема все еще существует, предоставьте точный код и инструкции по воспроизведению, которые может использовать каждый. - person Doug Stevenson; 20.01.2018
comment
К сожалению, у меня не работает на локальном эмуляторе. Используемые версии: firebase:^4.6.0, firebase-admin:^5.5.1, firebase-functions:^0.7.5. Но это работает в облаке, это нехорошо. Должен ли я поднять ошибку для этого? - person Ati Ranzuglia; 21.01.2018
comment
Я думаю, это известная проблема, что эмулятор работает немного иначе, чем реальная среда выполнения Cloud Functions. Не стесняйтесь регистрировать ошибку и добавлять свой голос. firebase.google.com/support/contact/bugs-features - person Doug Stevenson; 21.01.2018