網站搜尋

firebase - JavaScript 轉 TypeScript 錯誤 - 雲端函式


我正在按照這個指南(https://www.youtube.com/watch?v=qZ1EFnFOGvE&list=PL55RiY5tL51r5jyQoPZhwLueLpPeAV6P9)嘗試我的第一個雲函數,該指南是用 JS 編寫的,但我改為使用 Typescript 編寫。

我已創建以下內容:

// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
//
 export const helloWorld = functions.https.onRequest((request, response) => {
  
  if (request.method !== 'POST') {
      return response.status(500).json({
          message: 'Not allowed'
      });
  }

  response.status(200).json({
      message: 'Hello World!'
  });
 });

然而,程式碼檢查工具給了我以下錯誤:

類型 '(request: Request, response: Response) => Response | undefined' 的參數不能指定給類型 '(req: Request, resp: Response) => void | Promise' 的參數。類型 'Response | undefined' 不能賦值給類型 'void | Promise'。類型 'Response' 不能賦值給類型 'void | Promise'。類型 'Response' 缺少類型 'Promise' 的以下屬性:then、catch、[Symbol.toStringTag]

我不確定如何修改程式碼。

答案#1

Typescript 預期一個函數要麼不返回任何東西,要麼返回一個 Promise。然而,你在 if 語句中返回了 response 對象,如果條件不成立則返回 undefined。在這種情況下,一個簡單的解決方法是:

export const helloWorld = functions.https.onRequest((request, response) => {

  if (request.method !== 'POST') {
    response.status(500).json({
       message: 'Not allowed'
    });
  } else {
    response.status(200).json({
      message: 'Hello World!'
    });
  }

});

如果你想要在函數中「返回」而不是使用 else 語句,你可以這樣做:

export const helloWorld = functions.https.onRequest((request, response) => {

  if (request.method !== 'POST') {
    response.status(500).json({
       message: 'Not allowed'
    });
    return;
  }
  
  response.status(200).json({
    message: 'Hello World!'
  });

});