为什么我无法访问发送到 HTTP Firebase 云函数的此 POST 请求的 body 或属性?
Why can't I access the body or properties of this POST request send to a HTTP Firebase Cloud Function?
我正在向 HTTP Firebase Cloud Function 端点发送 POST
请求,其中包含以下 body:
{
"securityContext": "edbsne0f17660e9ab49ad9bc3ddd4656230e0a9304bd15916f595b793da9109e1f7aa61e76c4afa91319011a7259b24ed583302334e22c5544c4e00506cf2fed93b28434e4088b22dda02712adf63bb6a370f",
"event": "onInstall",
"orgId": "7001935574",
"dc": "AU"
}
但是当我尝试访问这些属性中的任何一个时,它显示 undefined
。整个body也是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
请求 here and here 的测试。
显然,如果请求有 content-type
个 application/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.
您可以使用 body 解析器中间件并强制 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
我正在向 HTTP Firebase Cloud Function 端点发送 POST
请求,其中包含以下 body:
{
"securityContext": "edbsne0f17660e9ab49ad9bc3ddd4656230e0a9304bd15916f595b793da9109e1f7aa61e76c4afa91319011a7259b24ed583302334e22c5544c4e00506cf2fed93b28434e4088b22dda02712adf63bb6a370f",
"event": "onInstall",
"orgId": "7001935574",
"dc": "AU"
}
但是当我尝试访问这些属性中的任何一个时,它显示 undefined
。整个body也是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
请求 here and here 的测试。
显然,如果请求有 content-type
个 application/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.
您可以使用 body 解析器中间件并强制 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