我正在尝试使此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.
如何解决此问题?可能是父母为空的情况吗?
答案 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编译器的要求。