簡體   English   中英

無法解析雲 Function 中的 getSignedUrl Promise

[英]Can't resolve getSignedUrl Promise in Cloud Function

我一直在嘗試調試一個 Google Cloud Function,它應該返回一個用於將文件上傳到 Google Cloud Storage 的 signedUrl。

我有一個 https 雲 function:

exports.gcpSecureURL = functions.https.onCall((data, res) => {

    const bucketName = data.bucket;
    const fileName = data.filename;

    let signedUrl = generateV4UploadSignedUrl(bucketName, fileName)
        .then(value => {
            console.log("VALUE: ", value);
            return value
        })

    res.send(signedUrl) 
        
});

永遠不會達到值,並且 signedUrl 始終是 Promise。

在 generateV4UploadSignedUrl function 我有:

async function generateV4UploadSignedUrl(bucketName, fileName) {
    // These options will allow temporary uploading of the file with outgoing
    // Content-Type: application/octet-stream header.
    const options = {
      version: 'v4',
      action: 'write',
      expires: Date.now() + 15 * 60 * 1000, // 15 minutes
      contentType: 'application/octet-stream',
    };
  
    // Get a v4 signed URL for uploading file
    const [url] = await storage
      .bucket(bucketName)
      .file(fileName)
      .getSignedUrl(options)
      
    return url;
  };

參數 bucketName 是正確的,而 fileName 只是我要上傳的文件的名稱,所以在我生成 url 的階段應該沒關系嗎?

我不明白為什么 signedUrl() 方法根本沒有返回任何東西。 我將存儲桶的權限更改為 AllUsers 的 StorageAdmin,並且我的 function 設置為允許未經身份驗證。

雲端function日志中generateV4UploadSignedUrl出現TypeError:

TypeError: (intermediate value) is not iterable
at generateV4UploadSignedUrl (/workspace/index.js:51:19)

我不知道發生了什么,並且 function 日志看起來很不透明。 請問我做錯了什么?

你這里有兩個問題。

首先,您使用的是可調用類型 function ,但您似乎正在使用它,就好像您正在編寫HTTP function 一樣 如果您想編寫可調用的 function,請務必查看相關文檔。 它們的工作方式與 HTTP 函數不同。 使用可調用函數,您必須返回 promise 以及要發送給調用者的數據。 使用 HTTP 函數,在所有異步工作完成后調用res.send()或等效函數以發送響應。 確保您了解兩者之間的區別。

永遠不會達到值,並且 signedUrl 始終是 Promise。

signedUrl始終是 promise,因為generateV4UploadSignedUrlasync ,並且所有async函數始終返回 promise。 您將不得不等待 promise 從 promise 獲取解析值。

你的 function 應該使用 async/await,看起來更像這樣:

exports.gcpSecureURL = functions.https.onCall(async (data, context) => {

    const bucketName = data.bucket;
    const fileName = data.filename;

    let signedUrl = await generateV4UploadSignedUrl(bucketName, fileName)
    console.log("VALUE: ", signedUrl);
    return signedUrl
        
});

雖然這可能不完全符合您的要求(確保signedUrl的全部內容是您想要發送給客戶端的內容),但它應該讓您更接近您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM