在某些情况下,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 函数,供任何调用方导入使用。