【问题标题】:Firebase snapshot.ref.parent is possibly 'null'Firebase snapshot.ref.parent 可能为“null”
【发布时间】:2019-11-28 07:30:40
【问题描述】:

我正在尝试使 firebase sample code 工作:

// Listens for new log added to /log/:pushId/original and creates an
// uppercase version of the log to /log/:pushId/uppercase
exports.db_uppercaseLog=functions.database
.ref('/log/{pushId}/original')
.onCreate((snapshot)=>{
  // Grab the current value of what was written to the Realtime Database.
  const original = snapshot.val();
  const uppercase = original.toUpperCase();
  // Return a Promise
  return snapshot.ref.parent.child('uppercase').set(uppercase);
});

如果我直接从index.js 部署,上面的代码可以运行。但它不会在 TypeScript 中编译。 TS lint 引发以下错误:

> functions@ build D:\Firebase\stax8\functions
> tsc

src/index.ts:94:10 - error TS2531: Object is possibly 'null'.

94   return snapshot.ref.parent.child('uppercase').set(uppercase);
            ~~~~~~~~~~~~~~~~~~~

Found 1 error.

试图通过隔离来解决问题,这会引发另一个问题:

  if (snapshot.ref.parent){
    return snapshot.ref.parent.child('uppercase').set(uppercase);
  }

// > TS7030: Not all code paths return a value.

如何解决这个问题?是否可能出现 null 父级的情况?

【问题讨论】:

    标签: typescript firebase google-cloud-functions


    【解决方案1】:

    从 API 文档中可以看出,snapshot.ref.parent 根据定义可以为空。您显示的代码正在正确检查:

    if (snapshot.ref.parent) {
      return snapshot.ref.parent.child('uppercase').set(uppercase);
    }
    

    但第二条错误消息告诉您,在 parent 可能为 null 的情况下,您的函数没有返回任何内容。如果您不希望它为 null(因为您确定提供的 DataSnapshot 将始终具有父级),只需返回 null:

    if (snapshot.ref.parent) {
      return snapshot.ref.parent.child('uppercase').set(uppercase);
    }
    else {
      return null;
    }
    

    这将满足您考虑了所有可能情况的 TypeScript 编译器。

    【讨论】:

    • onCreate 事件期望返回 Promise。可以返回 null 而不是 promise 吗? @道格史蒂文森
    • 如果您没有任何异步工作要完成,您可以返回 null。
    【解决方案2】:

    这是因为在您的 tsconfig.json 文件中,您有以下内容:

    strictNullChecks : true
    

    您可以将其更改为 false,也可以使用可选链接:

    return snapshot?.ref?.parent?.child('uppercase').set(uppercase)
    

    您可以在这里查看更多信息:

    https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining

    https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#--strictnullchecks

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2018-02-12
      • 2021-04-14
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多