如何在Firebase云功能中处理Bad JSON?

时间:2017-07-26 19:10:52

标签: javascript firebase firebase-realtime-database google-cloud-functions

我正在创建一个使用firebase-cloud-functions的firebase应用程序。

index.js

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

这是非常简单的功能。我想在端点上用一些有效负载发出POST请求。当我使用Firebase云功能模拟器和带有bad json

的POSTman测试API时
{
    "phoneNumber: "9632725300"
}

服务器刚刚崩溃!我的问题是如何处理像这样的firebase函数中的错误请求。

出现此错误 enter image description here

3 个答案:

答案 0 :(得分:4)

服务器没有崩溃。你发送了一个错误的请求(格式错误的JSON),并且它的状态代码为400,这是“错误的请求”。

你宁愿纠正你的JSON ......

编辑:

如果您真的希望能够发送无效的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

答案 1 :(得分:1)

您遇到的实际上并不是服务器崩溃。事实上,从技术上讲,通过使用云功能,您不会让服务器崩溃。 (For this reason they're called "Serverless Infrastructure")您在云功能上执行的每个请求/操作都有点像一个全新的服务器。实际上,这对云功能来说实际上是多么奇妙。 (这是一个过于简化的解释,我建议阅读更多关于它的更多深入解释)

话虽如此,据我所知,你试图弄清楚你得到的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's a bad json!
}

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

使用此辅助函数,如果您必须处理大量外部JSON资源,您可以轻松确定您尝试解析的JSON是否良好,如果不是,您至少可以处理错误你的方式。

希望这会有所帮助:)

答案 2 :(得分:0)

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

从屏幕截图中,我看到JSON无效或格式错误。它包含换行符(\ n)和制表符空格(\ t)字符。此外,关键" phoneNumber"没有用双引号括起来,这再次使JSON无效。

这是服务器应该接收的有效JSON格式

{
    "phoneNumber": "9632725300"
}