如果不希望返回任何内容,我应该在 https 可调用函数中返回什么

Rau*_*aul 5 javascript firebase google-cloud-platform google-cloud-functions

我已经实现了一个 HTTPs (onCall) 函数,如果工作成功完成,它会向客户端抛出一些错误或返回true。问题是我不明白为什么要返回 true (因为当我抛出错误时我不返回false)。

由于 HTTP 协议需要向客户端返回响应才能完成请求,那么我应该向客户端返回什么?我正在考虑删除我抛出的错误并返回一个经典的 HTTP 响应(状态代码、正文...)。

有任何想法吗?这是我在做什么:

exports.function = functions
  .region("us-central1")
  .runWith({ memory: "2GB", timeoutSeconds: 120 })
  .https.onCall(async (data, context) => {

        // Lazy initialization of the Admin SDK
        if (!is_function_initialized) {
          // ... stuff
          is_uploadImage_initialized = true;
        }
    
        // ... asynchronous stuff
    
        // When all promises has been resolved...
        // If work completed successfully
        return true;
    
       /*
         Is it correct instead ???
         return {code: "200 OK", date: date, body: message };
       */
    
    
       // Else, if errors
       throw new Error("Please, try again later.");
    
       /*
         Is it correct instead ???
         return {code: "418 I'm a teapot", date: date, body: message };
       */

   }
Run Code Online (Sandbox Code Playgroud)

Ren*_*nec 5

正如文档中所解释的:

要使用 HTTPS 可调用函数,您必须使用适合您平台的客户端 SDK 以及functions.https后端 API(或实现协议

这意味着在任何情况下您都必须遵循该协议,因为客户端 SDK 确实实现了该协议。

那么让我们看看关于发送给客户端(即调用者或消费者)的响应的协议是怎么说的:

协议规定了Response Body的格式如下:

来自客户端端点的响应始终是 JSON 对象。它至少包含 或dataerror以及任何可选字段。如果响应不是 JSON 对象,或者不包含数据或错误,则客户端 SDK 应将请求视为失败,并显示 Google 错误代码 INTERNAL 。

error- ....

data- 函数返回的值。这可以是任何有效的 JSON 值。firebase-functions SDK 会自动将用户返回的值编码为这种 JSON 格式。客户端 SDK 根据下面描述的序列化格式自动将这些参数解码为本机类型。

如果存在其他字段,则应忽略它们。

因此,要回答您的问题“我应该向客户端返回什么?”,您应该返回可以 JSON 编码的数据。另请参阅协议文档的这一部分。


例如,正如文档中详细介绍的,在可调用云中,您可以执行以下操作

return {
  firstNumber: firstNumber,
  secondNumber: secondNumber,
  operator: '+',
  operationResult: firstNumber + secondNumber,
};
//Excerpt of the doc
Run Code Online (Sandbox Code Playgroud)

或者,你可以这样做

return {result: "success"}
Run Code Online (Sandbox Code Playgroud)

在您的具体情况下(“如果 https 可调用函数不希望返回任何内容,我应该返回什么”),正如您在问题中提到的那样,您很可能返回以下内容:

const date = new Date();
const message = "the message";

return { code: "200 OK", date: date, body: message };
Run Code Online (Sandbox Code Playgroud)

但您也可以这样做return true;return null;...这取决于您来决定在您的上下文中什么是有意义的。


请注意,在您返回的情况下,客户端不会将{ code: "200 OK", date: date, body: message }的值code视为 HTTP 响应代码,因为此 JSON 对象已注入到响应正文中。