如何处理 Firebase Cloud Functions 中的错误 JSON?

Posted

技术标签:

【中文标题】如何处理 Firebase Cloud Functions 中的错误 JSON?【英文标题】:How to handle Bad JSON in Firebase Cloud Functions? 【发布时间】:2018-01-02 06:47:42 【问题描述】:

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

index.js

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

这是非常简单的功能。我想用一些有效负载在端点上发出POST 请求。当我使用 Firebase Cloud Function Emulator 和 POSTman 和 bad json 测试 API 时


    "phoneNumber: "9632725300"

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

出现此错误

【问题讨论】:

"服务器刚刚崩溃!"服务器是怎么崩溃的?错误信息是什么? 【参考方案1】:

服务器没有崩溃。你向它发送了一个错误的请求(格式错误的 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

【讨论】:

您写道:“……它完美地响应了状态码 400……”。我们发现 Firebase HTTP 函数在这种情况下挂起,而不是发送 400 响应。 我怀疑这是否相关......在这种情况下,HTTP 函数返回了 400 响应。我从来没有简单地挂起而不是返回 400 的 firebase 函数。 当模拟器在本地运行时,错误的 JSON 会发生挂起,并且我们还没有找到任何方法来在函数实时运行时返回自定义错误消息。这是因为 https.onRequest 在将请求传递给我们的自定义处理程序之前会进行 JSON 解析。【参考方案2】:

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

话虽如此,据我了解,您正在尝试确定您获得的 JSON 是否无效(坏)。有时,当我必须连接一堆外部服务时,很少,但有时,它们会返回我的 Cloud Functions 无法解析的错误 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 是否良好,如果不是,你至少可以按照自己的方式处理错误.

希望这会有所帮助:)

【讨论】:

据我所知,https.onRequest 在将请求传递给自定义处理程序之前会进行 JSON 解析。结果,我们还没有找到catch解析错误的方法。如果 https.onRequest 已经尝试解析它(并返回 400 错误),你如何得到坏的 json @ShaunLuttin 在这里查看接受的答案:***.com/questions/42950561/… - 它可能会为您提供解决方案。 (总结:你可以使用req.rawBody,它返回一个Buffer。)【参考方案3】:

\n\t"phoneNumber: "9632725300"\n

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

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


    "phoneNumber": "9632725300"

【讨论】:

以上是关于如何处理 Firebase Cloud Functions 中的错误 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 如何处理离线时执行的事件?

登录时如何处理状态(Ionic、Firebase、AngularJS)?

如何处理firebase中多个where查询的索引?

如何处理 Firebase 中过期的用户 ID 令牌?

firebase、flutter应该如何处理好友请求和邀请? [关闭]

如何处理 google firebase web app 的安全性?