我在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
。把它作为一个声明放在自己的行上
答案 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
可以修复错误。