【问题标题】:Inconsistently getting 'FirebaseError: Response is not valid JSON object.'不一致地获得“FirebaseError:响应不是有效的 JSON 对象。”
【发布时间】:2022-06-11 07:07:39
【问题描述】:

我正在开发一个带有 spotify 集成的 react-native 应用程序。我已经设置了带有身份验证代码授权的 oAuth 流程,我可以在其中获取授权代码。然后,我在 firebase 上设置了云功能来代理实际的令牌交换(我不想向客户透露我的秘密!)。我添加了日志,可以看到该函数正在正确完成与 spotify 令牌端点的交换,并接收刷新和访问令牌。

const tokenRequeset = functions.https.onCall(async (data, context) => {

      // spotify network request, error handling, etc here ....

      // I want to emphasize that this network request completes 
      // properly - my log statement below verifies in server logs
      // that I'm getting the expected value.
      const resp = await axios.post(
          "https://accounts.spotify.com/api/token",
          QueryString.stringify({
            grant_type: "authorization_code",
            code: code,
            redirect_uri: redirectURI,
          }),
          {
            headers: {
              "Authorization": `Basic ${BEARER_TOKEN}`,
              "Content-Type": "application/x-www-form-urlencoded",
            },
          }
      );

      console.log(resp.data.access_token); 
      return { status: "success", token: resp.data.access_token };
});

export default tokenRequest

resp.data.access_token 是用于访问 spotify API 的 JWT 访问令牌 - 它是一个字符串值 according to the API。 (我会提供一个示例,但它是一个身份验证令牌)

但是,当我尝试使用 firebase/functions 包从我的应用中调用我的函数时,有时会收到“FirebaseError: Response is not valid JSON object”。

让这个特别有趣的是它不一致 - 昨天我遇到了问题,然后它就消失了(没有更改我的代码!)。我能够同时访问本地仿真器功能和部署的功能没问题,但今天“FirebaseError:响应不是有效的 JSON 对象”。错误又回来了。

我已经在本地和部署的函数上检查了失败调用的日志,并且在这两种情况下,spotify API 调用都在工作 - 我得到了所有预期的行为,直到返回(这不起作用出于某种原因)。

在客户端,我正在像这样配置 firebase:

const firebaseConfig = {
  // Shhhhhh
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const functions = getFunctions(app);
// Uncomment to run locally
connectFunctionsEmulator(functions, "localhost", 5001);

export { app, functions };

然后像这样暴露和调用它:

const SpotifyAuth = httpsCallable(functions, "spotify-auth");

const resp = await SpotifyAuth(code, redirectURI)

(我知道这不是完整的代码 - 我抓取了相关部分。如果需要,很乐意提供更多)。

我尝试查找此错误,发现 ~2018/2020 的结果与旧样式的 firebase/functions 相关,但它们似乎与区域有关,我部署在默认的 us-central1 中 - 根据SDK documentation 这意味着我不应该碰它。

该问题的现有解决方案似乎也是基于旧式的函数调用,而不是最近的httpsCallable()getFunctions(app)

我快疯了,想弄清楚为什么有时我会收到这个错误

编辑:

有关错误的更多信息 - 我今天再次运行我的代码并没有在本地看到错误,但是当我点击部署的函数时我确实看到了它。

再次强调,我认为错误出在 firebase 网络响应中 - 如果您查看网络请求,我收到 200 但响应为空。

做了一个额外的完整的函数模型,看看会发生什么:

const test = functions.https.onCall((data, context) => {
  console.log("function call");
  return { status: "success", token: "asdfasdfasdfasdfasfs" };
});

export default test;

我遇到了同样的错误。

更新: 我已经放弃将 sdk 和 onCall 方法用于 firebase 云功能 - 到目前为止,我的所有测试都表明这是谷歌云功能方面的错误或错误,我无能为力。

好消息是onRequest 方法似乎没有这个问题 - 它的行为正确且可靠。

我真的希望我一直搞砸了,我错过了一个解决方案 - SDK 看起来很棒,我喜欢它(应该)提供的集成,但据我所知是正确的现在除非有错误修复(或者如果我做错了更新文档),它似乎根本行不通。

我仍在计划使用 firebase,但根据我目前的经验,我建议任何在服务器工作早期的人考虑使用其他产品(至少如果您需要使用这些功能 - 我能够获得存储空间工作)。

【问题讨论】:

  • 请编辑问题以显示resp.data.access_token 的确切值。如果您的应用调用您的函数,您希望它收到什么?
  • 知道了 - 我从 spotify API 接收到一个字符串值,我将它传回我的函数。在我的函数成功响应后,我希望在“数据”字段中看到:{ status: "success", token: "string value for access_token here"}。同样,当函数工作并且我没有收到错误时,我会得到格式正确的响应,其中 token 值是正确的字符串。
  • 函数不起作用时的值是多少?
  • @Royalelk 您可以使用该解决方案回答您自己的问题,以便我们将其标记为首选解决方案。
  • 当函数不起作用时,记录的假定返回值 (console.log(resp.data.access_token)) 会显示我希望看到的正确字符串。同样,据我所知,网络请求 spotify 正在功能方面工作——只是关于返回值的一些事情失败了。我还尝试记录{ status: "success", token: resp.data.access_token} 以查看对象是否由于某种原因格式错误/奇怪,但它总是会产生我希望看到/想要的返回值。当我检查失败的网络请求时,“响应”只是空的。

标签: javascript firebase react-native google-cloud-functions expo


猜你喜欢
  • 2021-01-21
  • 2020-07-26
  • 2021-06-24
  • 2023-03-18
  • 2017-04-01
  • 2022-07-07
  • 2012-09-22
  • 2021-03-03
  • 2015-02-14
相关资源
最近更新 更多