Как обращаться с Bad JSON в облачных функциях Firebase?

Я создаю приложение firebase, которое использует функции firebase-cloud.

index.js

exports.auth = functions.https.onRequest((request, response) => {
  response.status(200).send({
    status : "Some Status"
  });
}

Это очень простые функции. Я хочу сделать запрос POST на конечной точке с некоторой полезной нагрузкой. Когда я тестировал API с использованием Firebase Cloud Function Emulator и POSTman с bad json

{
    "phoneNumber: "9632725300"
}

Сервер просто разбился! Мой вопрос заключается в том, как обращаться с плохим запросом в таких функциях firebase.

с этой ошибкой введите описание изображения здесь

Ответ 1

Сервер не разбился. Вы отправили ему плохой запрос (искаженный JSON), и он отлично ответил на код состояния 400, который является "Плохим запросом".

Вы скорее исправите свой JSON...

EDIT:

Если вы действительно хотите отправить недействительный JSON, вы можете сделать это, обойдя парсер JSON. Для этого вы можете либо изменить свой запрос, чтобы заголовок типа содержимого был установлен на "text/plain". Этот тип содержимого будет использовать синтаксический анализатор текста, который не будет анализировать любой JSON.

Обратите внимание, что для этого вам потребуется обработать JSON-парсинг самостоятельно, но вы сможете самостоятельно обрабатывать ошибку, используя try-catch.

let json;
try {
    json = JSON.parse(json);
} catch (e) {
    // Handle JSON error.
}

Взято из https://firebase.google.com/docs/functions/http-events

Ответ 2

То, что вы испытываете, на самом деле не является сбоем сервера. Фактически, технически, используя Cloud Functions, у вас нет сервера для сбоя. (По этой причине они называются "безсерверной инфраструктурой" ). Каждый запрос/операция, выполняемая в облачных функциях, похожа на совершенно новый сервер, Это на самом деле то, что фантастично о облачных функциях в целом. (Это слишком упрощенное объяснение, я бы предложил немного почитать об этом для лучшего углубленного объяснения)

С учетом того, что я понимаю, вы пытаетесь выяснить, является ли JSON у вас неправильным (плохо) или нет. Иногда, когда мне приходится подключать кучу внешних сервисов, редко, но иногда они возвращают плохой JSON, который мои Облачные функции не могут разобрать, поэтому выдает ошибку.

Решение состоит в том, чтобы поместить ваш JSON.parse в отдельную функцию и блок try/catch, подобный этому:

function safelyParseJSON (json) {
  var parsed;

  try {
    parsed = JSON.parse(json);
  } catch (e) {
    // BAD JSON, DO SOMETHING ABOUT THIS HERE.
  }

  return parsed; // will be undefined if it a bad json!
}

function doSomethingAwesome () {
  var parsedJSON = safelyParseJSON(data);
  // Now if parsedJSON is undefined you know it was a bad one, 
  // And if it defined you know it a good one. 
}

С помощью этой вспомогательной функции, если вам нужно иметь дело с большим количеством внешних ресурсов JSON, вы можете легко определить, хорошо ли JSON, который вы пытаетесь разобрать, и если нет, вы можете хотя бы обрабатывать ошибку по своему пути,

Надеюсь, что это поможет:)

Ответ 3

{\n\t"phoneNumber: "9632725300"\n}

На скриншоте я вижу, что JSON недействителен или искажен. Он содержит символы новой строки (\n) и табуляции (\ t). Кроме того, ключ "phoneNumber" не заключен в двойные кавычки, что снова делает недействительным JSON.

Здесь допустимый формат JSON, который сервер должен получить

{
    "phoneNumber": "9632725300"
}