在使用云函数时,我们遇到了以下错误:

时间:2023-10-21 18:50:18.281东部时间 功能:v8-专家

---updateUserByID finish update---

Caused by: Error 
    at WriteBatch.commit (/workspace/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/write-batch.js:433:23) 
    at DocumentReference.update (/workspace/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/reference.js:433:14) 
    at Object.updateUserByID (/workspace/dist/src/DB/db.js:74:14) 
    at createSpecialistOrderListService (/workspace/dist/src/crud/specialist/services/specialistList/createSpecialistOrderListService.js:38:29) 
    at runMicrotasks (<anonymous>) 
    at processTicksAndRejections (node:internal/process/task_queues:96:5) 
    at async getRecommendedSpecialistsListController (/workspace/dist/src/crud/specialist/controllers/getRecommendedSpecialistsListController.js:25:44) 
    at async /workspace/dist/src/framework/express/middlewares/express-handler.js:18:36 

Error Details:
- Code: `13`
- Description: `Received RST_STREAM with code 1`
- Metadata: `{ internalRepr: Map(0) {}, options: {} }`
- Note: `Exception occurred in retry method that was not classified as transient`

当我们在更新函数中执行以下命令时,似乎会弹出此错误:

const writeResult = await admin
      .firestore()
      .collection(FirestoreCollections.Users)
      .doc(userID)
      .update(fieldsToUpdate);

fieldsToUpdate人的例子:

[
  {
    "boolean": true,
    "number": 100,
    "id": "some_id"
  }
]

然而,令人费解的是,这种方法似乎在我们的其他云功能中运行得无懈可击.😕 在某些情况下,即使在更新过程中引发错误,FiRestore中的数据仍可能被更新.

  1. 即使在本地进行测试,该问题仍然存在.
  2. 使用相同的方法创建新的云函数后,一切操作都很顺利.

推荐答案

上周我也遇到了同样的问题,似乎是在FireBase/GRPC实现中与Firebase调用之间的长时间延迟有关.

此外,Firebase库似乎正在远离RPC,但如果您不设置preferRest: true(see docs),它仍将其保留为默认选项

对我来说,当我在执行操作之前调用init或将Firebase配置更改为更喜欢使用REST通信时,它会起作用.

以下是我的代码片段:

function getFbDb() {
  const mainFirebaseApp = firebaseAdmin.initializeApp({
      credential: firebaseAdmin.credential.applicationDefault()
    }, uuid.v4());

  const db = mainFirebaseApp.firestore();
  const settings = {
    preferRest: true,
    timestampsInSnapshots: true
  };
  db.settings(settings);
  return { db, firebaseApp: mainFirebaseApp };
}
const { db, firebaseApp } = getFbDb();

每次必须执行操作时都使用const { db, firebaseApp } = getFbDb();.

在第一次失败后,另有"dirty option"人似乎正在使用重试方法.

如果这对你不起作用,那就密切关注2345号问题,看看接下来会发生什么.

Node.js相关问答推荐

Node.js promise 循环中的所有多个API调用

在导入时未找到Pupeteer-PAGE-Proxy包

自动将Selify打开的Chrome窗口移动到Mac OS中的第三个显示器

如何在ejs模板中使用循环显示多个结果?

为什么在导出的函数中调用node-sqlite3中的数据库方法时不起作用?

从 Response.json() 返回的 JSON 似乎无效?

如何使用 NodeJS 加密模块将 ECDH 密钥转换为 PEM 格式

使用 create-expo-app 时如何更改 webpack-config.js 中的哈希函数?

使用 .pipe(res) 向客户端发送音频不允许您搜索?

如何在 cypress 测试中进行计算

Node.js 变量声明和范围

如何将使用 Gulp 的 node 部署到 heroku

如何使用适用于 Node.js 的 AWS 开发工具包将 Amazon S3 中的所有对象从一个前缀复制/移动到另一个前缀

分块 WebSocket 传输

如何在 Mongoose 模式中设置数组大小限制

Node.js 服务器中没有缓存

如何在 node 中转义 shell 命令的字符串?

代理(如提琴手)可以与 Node.js 的 ClientRequest 一起使用吗

如何使用 cookie 创建 HTTP 客户端请求?

如何仅在丢失的路由上将 Express.js 设置为 404?