Firebase Admin SDK 错误:表达式的类型为“void”。将其作为声明放在自己的行中
Posted
技术标签:
【中文标题】Firebase Admin SDK 错误:表达式的类型为“void”。将其作为声明放在自己的行中【英文标题】:Firebase Admin SDK ERROR: Expression has type `void`. Put it on its own line as a statement 【发布时间】:2018-10-22 08:09:50 【问题描述】:我正在关注 firebase 的这个例子。 https://firebase.google.com/docs/functions/get-started
我刚刚下载了所有必需的 API 并开始学习。
我正在使用 TypeScript 创建函数,这个“Hello World”https://github.com/firebase/functions-samples/blob/master/typescript-getting-started/functions/src/index.ts 运行良好。
但是“addMessage()”没有。
exports.addMessage = functions.https.onRequest((req, res) =>
const original = req.query.text;
return admin.database().ref('/messages').push(original: original).then((snapshot) =>
return res.redirect(303, snapshot.ref.toString());
);
);
它给出了这个错误信息:
Firebase Admin SDK 错误:表达式的类型为
void
。将其作为语句单独放在一行
【问题讨论】:
【参考方案1】:这有点晚了,但万一其他人遇到这个问题,问题是res.redirect
没有返回值,所以它的返回类型定义为void
。
错误是因为return
语句需要一个值。你不能返回void
。因此,TypeScript 编译器将return res.redirect(303, snapshot.ref.toString());
视为return void
,这是产生错误的原因。
解决办法是把return放在下一行:
res.redirect(303, snapshot.ref.toString());
return;
不幸的是,虽然它是无效的 TypeScript,但最佳做法是始终在最终确定响应的代码之前放置一个 return,这样它就不会落入函数中的其余代码。
将return放在下一行很容易忘记,扫描代码时容易错过。带有响应终结的返回表明处理已完成。
您可以通过禁用 no-void-expression
linting 规则来禁用此功能,但不建议这样做,因为它通常是一个有用的规则。
【讨论】:
【参考方案2】:我在未定义为 async
的函数前面添加 await
关键字遇到了这个 eslint 错误,例如
function foo(bar)
return bar;
...
await foo(bar);
删除await
修复了错误。
【讨论】:
以上是关于Firebase Admin SDK 错误:表达式的类型为“void”。将其作为声明放在自己的行中的主要内容,如果未能解决你的问题,请参考以下文章
“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌
FireBase 消息无法在 OSGI 包中加载 admin_sdk.properties