Firebase Admin SDK错误:Expression的类型为“void”。把它作为一个陈述

时间:2018-05-11 21:07:05

标签: typescript firebase firebase-realtime-database google-cloud-functions

我在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管理员SDK错误:表达式的类型为void。把它作为一个声明放在自己的行上

2 个答案:

答案 0 :(得分:4)

这有点晚了,但是如果其他人遇到此问题,问题在于res.redirect不返回值,因此其返回类型定义为void

该错误是因为return语句需要一个值。您无法返回void。因此,TypeScript编译器将return res.redirect(303, snapshot.ref.toString());视为return void,这就是产生错误的原因。

解决方案是将返回值放在下一行:

res.redirect(303, snapshot.ref.toString());
return;

不幸的是,尽管它是无效的TypeScript,但最佳实践是始终将返回值放在最终确定响应的代码之前,因此不会影响函数中的其余代码。

将返回值放在下一行很容易忘记,并且在扫描代码时很容易错过。带有响应完成的返回使处理很清楚。

您可以通过禁用no-void-expression掉毛规则来禁用此规则,但是不建议这样做,因为它通常是有用的规则。

答案 1 :(得分:1)

我在未定义为await的函数前面添加了async关键字时遇到了此错误,

function foo(bar) {
  return bar;
}
...
await foo(bar);

删除await可以修复错误。