Облачная функция HTTP-запуска с планировщиком облака - PullRequest
0 голосов
/ 09 ноября 2018

У меня проблема с работой в облачном планировщике для моей облачной функции. Я создал работу со следующими параметрами:

Цель : HTTP

URL : URL моего триггера для облачной функции

HTTP-метод : POST

Кузов :

{
 "expertsender": {
  "apiKey": "ExprtSender API key",
  "apiAddress": "ExpertSender APIv2 address",
  "date": "YYYY-MM-DD",
  "entities": [
     {
        "entity": "Messages"
     },
     {
        "entity": "Activities",
        "types":[
           "Subscriptions"
        ]
     }
  ]
 },
 "bq": {
         "project_id": "YOUR GCP PROJECT",
         "dataset_id": "YOUR DATASET NAME",
         "location": "US"
       } 
}

Реальные значения были изменены в этом теле.

Когда я запустил эту работу, я получил ошибку. Причина вызвана обработкой тела из запроса POST.

Однако, когда я беру это тело и использую его как запускающее событие в тестировании, я не получаю никаких ошибок. Так что я думаю, что проблема в представлении тела для моей работы, но я понятия не имел, как это исправить. Я буду очень рад за любую идею.

1 Ответ

0 голосов
/ 27 мая 2019

Отказ от ответственности: Я пытался решить ту же проблему с помощью NodeJS, и я могу получить решение


Я понимаю, что это старый вопрос. Но я чувствовал, что стоит ответить на этот вопрос, поскольку я потратил почти 2 часа, чтобы найти ответ на этот вопрос.

Сценарий - 1: запуск функции облака через планировщик облака

  • Функция не может прочитать сообщение в теле запроса.

Сценарий - 2: запуск облачной функции через вкладку «Тест» в интерфейсе облачной функции

  • Вызов функции всегда выполняется без ошибок.

Что я нашел?

  • Когда подпрограмма GCF выполняется через Cloud Scheduler, она отправляет заголовок content-type как application/octet-stream. Это делает экспресс js неспособным анализировать данные в теле запроса, когда планировщик облака отправляет данные.
  • Но когда для проверки функции через интерфейс облачной функции используется точно такое же тело запроса, все работает нормально, потому что функция Testing в интерфейсе отправляет заголовок content-type как application/json и выражает js может читать тело запроса и анализирует данные как объект JSON.

Решение

Мне пришлось вручную анализировать тело запроса как JSON (явно используя условие if на основе заголовка типа содержимого), чтобы получить данные в теле запроса.

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  console.log('Headers from request: ' + JSON.stringify(req.headers));

  let parsedBody;

  if(req.header('content-type') === 'application/json') {
    console.log('request header content-type is application/json and auto parsing the req body as json');
    parsedBody = req.body; 
  } else {
    console.log('request header content-type is NOT application/json and MANUALLY parsing the req body as json');
    parsedBody = JSON.parse(req.body);
  }

  console.log('Message from parsed json body is:' + parsedBody.message);

  res.status(200).send(message);
};

Это действительно особая проблема, которую Google должен решить, и, надеюсь, Google скоро исправит ее.

Облачный планировщик - проблема с заголовком типа контента

...