node.js - 为什么我无法访问发送到 HTTP Firebase 云函数的此 POST 请求的正文或属性?

标签 node.js firebase google-cloud-functions

我正在向包含以下正文的 HTTP Firebase Cloud Function 端点发送 POST 请求:

{
  "securityContext": "edbsne0f17660e9ab49ad9bc3ddd4656230e0a9304bd15916f595b793da9109e1f7aa61e76c4afa91319011a7259b24ed583302334e22c5544c4e00506cf2fed93b28434e4088b22dda02712adf63bb6a370f",
  "event": "onInstall",
  "orgId": "7001935574",
  "dc": "AU"
}

但是当我尝试访问任何这些属性时,它显示 undefined。整个主体也是 undefined

这就是我的 onRequest HTTP Cloud Function 端点的样子。它还显示了我其他获取 body 数据的失败尝试,我已将其注释掉:

export const getZohoDeskCallBack = functions.https.onRequest((req, res) => {

  const body = req.body;
  functions.logger.info('body', body);

  const rawBody = req.body;
  functions.logger.info('rawBody', rawBody);

  // Other attempt 1:
  // const bodySecurityContext = req.body.securityContext;
  // functions.logger.info('bodySecurityContext', bodySecurityContext);

  // Other attempt 2:
  // const rawBodySecurityContext = req.rawBody.securityContext;
  // functions.logger.info('rawBodySecurityContext', rawBodySecurityContext);

  // Other attempt 3:
  // const reqBodyToJSON = req.body.toJSON();
  // functions.logger.info('req.body.toJSON()', reqBodyToJSON);

  // Other attempt 4:
  // const reqRawBodyToJSON = req.rawBody.toJSON();
  // functions.logger.info('req.rawBody.toJSON()', reqRawBodyToJSON);

  // Other attempt 5:
  // const reqBodyToJSONparse = JSON.parse(req.body);
  // functions.logger.info('reqBodyToJSONparse', reqBodyToJSONparse);

  // Other attempt 6:
  // const reqRawBodyToJSONparse = JSON.parse(req.rawBody);
  // functions.logger.info('reqRawBodyToJSONparse', reqRawBodyToJSONparse);

  // Other attempt 7:
  // const reqBodyToJSONparse = req.body.toString();
  // functions.logger.info('reqBodyToJSONparse', reqBodyToJSONparse);

  // Other attempt 8:
  // const reqRawBodyToJSONparse = req.rawBody.toString();
  // functions.logger.info('reqRawBodyToJSONparse', reqRawBodyToJSONparse);

  // Other attempt 9:
  // const reqBodyToJSONparse = req.body.toString();
  // const securityContext = reqBodyToJSONparse.securityContext;
  // functions.logger.info('securityContext', securityContext);

  res.end();
});

您可以看到POST 请求的测试herehere .

显然,如果请求的content-typeapplication/json,Firebase Cloud Functions 将自动解析JSON 并将其放入body属性。

但是正如您从上面链接的那些测试中看到的那样, header content-type 为空或缺失。此外,我无法更改POST 请求,因为我无法控制它。

也许这就是问题所在?如果是这样,我想我可以从 rawBody 属性访问它,但这也不起作用。

我一直在努力解决这个问题。任何帮助将不胜感激。

最佳答案

Apparently, if a request has a content-type of application/json Firebase Cloud Functions will automatically parse the JSON and put it into the body property.

那是因为您确实需要添加 Content-Type header ,并且 Firebase 会为该请求使用适当的解析器。有关 Firebase 使用的库的更多信息,请查看 documentation .

您可以使用主体解析器中间件并强制 parse the body as JSON如下图:

import * as functions from "firebase-functions/v1";
import * as express from "express";
import * as bodyParser from "body-parser";

const app = express();

const parseJsonMiddleware = bodyParser.json({
  type(req) {
    return true;
  },
});

app.post("/getZohoDeskCallBack", parseJsonMiddleware, (req, res) => {
  const body = req.body;
  console.log("body", body);

  const rawBody = req.body;
  console.log("rawBody", rawBody);

  res.end();
});

export const api = functions.https.onRequest(app);

您必须更新您的 webhook URL,因为这将在 URL 中添加 /api,如下所示:

POST https://[FUNCTIONS_URL]/api/getZohoDeskCallBack

关于node.js - 为什么我无法访问发送到 HTTP Firebase 云函数的此 POST 请求的正文或属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72429976/

相关文章:

javascript - 仅显示红色 Node 中 msg.payload 中的值字段

node.js - 尝试使用 "karma init"初始化 karma 配置文件。但不工作

javascript - 如何在node.js中向GET请求添加参数?

java - Firebase Firestore 库导致 : java. lang.RuntimeException : com. android.builder.dexing.DexArchiveMergerException:无法合并 dex

android - DataSnapshot 值是否有可能为空?

ios - 如何在 firestore swift 中获取当前用户文档

node.js - Cloud Functions for Firebase - 未配置结算帐号

node.js - 将 Microsoft 机器人部署到本地计算机上并托管它

javascript - Firebase 功能 - 删除父级

android - 在 Firebase 云函数中返回 map 为空