Firebase snapshot.ref.parent可能为'null'

时间:2019-11-28 07:30:40

标签: typescript firebase google-cloud-functions

我正在尝试使此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.

如何解决此问题?可能是父母为空的情况吗?

2 个答案:

答案 0 :(得分:1)

这是因为在您的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

答案 1 :(得分: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编译器的要求。