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

Firebase - 使用 firebase admin sdk 跨子域共享身份验证

无法获取使用Admin SDK Firebase的用户列表

Firebase Admin SDK、FCM 云消息传递

使用 Admin SDK 将文件上传到 Firebase 存储