Javascript 如何处理Firebase云函数中的错误JSON?

Javascript 如何处理Firebase云函数中的错误JSON?,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我正在创建一个使用firebase云函数的firebase应用程序 index.js exports.auth = functions.https.onRequest((request, response) => { response.status(200).send({ status : "Some Status" }); } 这是非常简单的函数。我想用一些有效负载在端点上发出POST请求。当我使用Firebase云函数模拟器和POSTman测试API时,使用了bad

我正在创建一个使用firebase云函数的firebase应用程序

index.js

exports.auth = functions.https.onRequest((request, response) => {
  response.status(200).send({
    status : "Some Status"
  });
}
这是非常简单的函数。我想用一些有效负载在端点上发出
POST
请求。当我使用Firebase云函数模拟器和POSTman测试API时,使用了
bad json

{
    "phoneNumber: "9632725300"
}
服务器崩溃了!我的问题是如何处理像这样的firebase函数中的错误请求

由于这个错误
服务器没有崩溃。您向它发送了一个错误的请求(格式不正确的JSON),它的响应非常完美,状态代码为400,即“错误的请求”

您希望更正您的JSON

编辑:

如果您确实希望能够发送无效的JSON,那么可以绕过JSON主体解析器。为此,您可以将请求更改为将内容类型标题设置为“text/plain”。此内容类型将使用文本体解析器,它不会解析任何JSON

注意,这样做需要您自己处理JSON解析,但允许您自己使用try-catch来处理错误

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

中可以看出,您所经历的实际上并不是服务器崩溃。事实上,从技术上讲,通过使用云功能,您不会让服务器崩溃。()您在云功能上执行的每个请求/操作都有点像一台全新的服务器。这就是云功能的神奇之处。(这是一个过于简化的解释,我建议多读一点,以便更深入地解释)

也就是说,据我所知,您正试图弄清楚您得到的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. 
}
有了这个helper函数,如果您必须处理大量外部JSON资源,您可以轻松确定您试图解析的JSON是否良好,如果不好,您至少可以按照自己的方式处理错误

希望这有帮助:)

{\n\t“电话号码:“9632725300”\n}

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

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

{
    "phoneNumber": "9632725300"
}

“服务器刚刚崩溃!“服务器是如何崩溃的?错误消息是什么?您写道:“…它的响应非常完美,状态代码为400…”。。。“。我们发现Firebase HTTP函数在这种情况下挂起,而不是发送400响应。我怀疑这与。。。在本例中,HTTP函数返回400响应。我从来没有让firebase函数简单地挂起而不是返回400。当模拟器在本地运行时,挂起会与错误的JSON一起发生,并且我们还没有找到任何方法在函数实时运行时返回自定义错误消息。这是因为
https.onRequest
在将请求传递给我们的自定义处理程序之前进行JSON解析。据我所知,
https.onRequest
在将请求传递给自定义处理程序之前进行JSON解析。因此,我们还没有找到捕获解析错误的方法。如果没有https.onRequest已经尝试解析它(并且返回了400个错误),您是如何得到错误的
json
的?@ShaunLuttin在这里看一看公认的答案:–它可能有您想要的解决方案。(摘要:您可以使用
req.rawBody
返回
缓冲区