在某些情况下,Firebase Callable Cloud Function 在没有 Promise 的情况下返回 void
Firebase Callable Cloud Function is returning void without a Promise in some cases
当这样调用 firebase 可调用云函数时:
const myFunctions = require('/path/to/functions/src/index.js');
myFunctions.myTestFunc(data, {
auth: {
uid: myId
}
}).then(r => {
console.log("THIS IS THE ACTUAL RESPONSE FROM CLOUD FUNCTION", r);
})
我得到:
属性 'then' 在类型 'void | Promise' 上不存在。 属性 'then' 在类型 'void' 上不存在。
即使有问题的可调用函数显然正在返回一个已解决的 Promise:
export const myTestFunc = functions.https.onCall(
async (data, context) => {
return new Promise((resolve) => {
resolve({success: true});
});
});
它仍然给出警告:
常量 myTestFunc: (req: e.Request, resp: e.Response) => void |承诺
本质上是说在某些情况下会返回 void。但是,当我明确返回上述承诺时,我不明白情况如何。
任何关于正在发生的事情的想法都将不胜感激。
如果您导航到 onCall()
的源代码,您会看到它的定义如下:
export declare function onCall(
handler: (data: any, context: CallableContext) => any | Promise<any>
): HttpsFunction & Runnable<any>;
你得到一个 HttpsFunction
,它是这样的:
export declare type HttpsFunction =
TriggerAnnotated & ((req: Request, resp: Response) => void | Promise<void>);
可以看到函数类型的return类型是void | Promise<void>
。它不关心你传递给它的是什么,这就是你得到的 - 一个接受 Request
and Response
and returns a void | Promise<void>
.[=22= 的函数]
如果您需要调用该函数并且想知道它是否 return 提供了一个您可以调用 then
的承诺(而不是无效的),那么您将需要检查它 return 编辑了一些非空的东西,并且它将假设 Promise:
const p = myFunctions.myTestFunc(req, res);
if (p) {
p.then(...)
}
看来您可能想查看 testing HTTP functions 的文档,如果您正在此处尝试这样做的话。通常没有理由直接调用由 onCall
编辑的函数 return。有一个测试库可以帮助解决这个问题。
如果您正在尝试为自己创建一个可重用的实用函数,那么您根本不应该使用 onCall。只需定义并导出正常的 JavaScript 函数,供任何调用方导入使用。
当这样调用 firebase 可调用云函数时:
const myFunctions = require('/path/to/functions/src/index.js');
myFunctions.myTestFunc(data, {
auth: {
uid: myId
}
}).then(r => {
console.log("THIS IS THE ACTUAL RESPONSE FROM CLOUD FUNCTION", r);
})
我得到: 属性 'then' 在类型 'void | Promise' 上不存在。 属性 'then' 在类型 'void' 上不存在。
即使有问题的可调用函数显然正在返回一个已解决的 Promise:
export const myTestFunc = functions.https.onCall(
async (data, context) => {
return new Promise((resolve) => {
resolve({success: true});
});
});
它仍然给出警告: 常量 myTestFunc: (req: e.Request, resp: e.Response) => void |承诺
本质上是说在某些情况下会返回 void。但是,当我明确返回上述承诺时,我不明白情况如何。
任何关于正在发生的事情的想法都将不胜感激。
如果您导航到 onCall()
的源代码,您会看到它的定义如下:
export declare function onCall(
handler: (data: any, context: CallableContext) => any | Promise<any>
): HttpsFunction & Runnable<any>;
你得到一个 HttpsFunction
,它是这样的:
export declare type HttpsFunction =
TriggerAnnotated & ((req: Request, resp: Response) => void | Promise<void>);
可以看到函数类型的return类型是void | Promise<void>
。它不关心你传递给它的是什么,这就是你得到的 - 一个接受 Request
and Response
and returns a void | Promise<void>
.[=22= 的函数]
如果您需要调用该函数并且想知道它是否 return 提供了一个您可以调用 then
的承诺(而不是无效的),那么您将需要检查它 return 编辑了一些非空的东西,并且它将假设 Promise:
const p = myFunctions.myTestFunc(req, res);
if (p) {
p.then(...)
}
看来您可能想查看 testing HTTP functions 的文档,如果您正在此处尝试这样做的话。通常没有理由直接调用由 onCall
编辑的函数 return。有一个测试库可以帮助解决这个问题。
如果您正在尝试为自己创建一个可重用的实用函数,那么您根本不应该使用 onCall。只需定义并导出正常的 JavaScript 函数,供任何调用方导入使用。