2017-03-27 147 views
2

隨着Firebase雲端功能的推出,我們正在考慮將我們當前的一些node.js服務器端代碼移至雲端功能。我遇到的一個問題是將文件從GCS存儲區下載到磁盤上的臨時文件,然後通過電子郵件將其作爲附件(使用mailgun-js)發送。firebase雲功能Google雲端存儲API錯誤

的一段代碼導致我的悲傷是:

return mkdirp(tempLocalDir).then(() => { 
    const bucket = gcs.bucket(gcsBucket); 
    const tempFilePath = tempLocalDir + gcsFile; 
    return bucket.file(gcsFile).download({ 
     destination: tempFilePath 
    }).then(() => { 
     console.log('File downloaded locally to', tempFilePath); 
     var messageSubject = "Test"; 
     var messageBody = "Test with attach"; 

     var mailgunData = { 
      from: , 
      to: agentEmail, 
      subject: messageSubject, 
      html: messageBody, 
      attachment: tempFilePath, 
     }; 
     mailgunAgent.messages().send(mailgunData, function (error, body) { 
      console.log(body); 
     }); 

    }); 

}); 

我得到的功能日誌中的錯誤信息是:

ApiError: Forbidden 
    at Object.parseHttpRespMessage (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:156:33) 
    at Object.handleResp (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:131:18) 
    at Duplexify.<anonymous> (/user_code/node_modules/@google-cloud/storage/src/file.js:724:21) 
    at emitOne (events.js:96:13) 
    at Duplexify.emit (events.js:188:7) 
    at emitOne (events.js:96:13) 
    at DestroyableTransform.emit (events.js:188:7) 
    at emitOne (events.js:96:13) 
    at Request.emit (events.js:188:7) 
    at Request.<anonymous> (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1108:14) 

我已經能夠將文件下載到在磁盤上的/ tmp /文件夾使用請求,這將是後備選項,但我真的想盡可能使用GCS工具。我「認爲」這是一個GCS認證錯誤,但我不知道如何跟蹤。對於GCS,我需要在雲功能的.config()中使用不同的身份驗證參數嗎?如果是這樣,我怎麼輸入它們?我們的GCS存儲桶和項目在Firebase存儲的引入之前發佈,但我們已成功將它用於運行在我們服務器上的節點功能。

由於提前, 扎克

回答

0

你需要能夠使用谷歌的雲存儲API之前識別。或者其他任何API。

這樣做的一種方法是轉到Google雲平臺上的API登錄頁面:here並將相應的服務帳戶密鑰下載爲JSON文件。然後將這個文件放在您的Firebase Project內的函數文件夾中。

最後,而不是使用:
const bucket = gcs.bucket(gcsBucket);

你會稱之爲:

const gcs = require('@google-cloud/storage'); 

const storageClient = gcs({ projectId: projectId, keyFilename: './keyFilename.json' }); const bucket = storageClient.bucket(gcsBucket);
有了您的專案編號和的KeyFileName。

+0

感謝您的回覆。不幸的是,我已經嘗試過了,但它不起作用。我想我可能有一個認證問題,但是在追蹤時遇到問題。 – Zach

3

求助:終於解決了上面的問題。問題是@ google-cloud/storage auth需要GCS項目ID作爲ID,但Firebase admin-sdk密鑰文件,而不是GCS項目密鑰文件。使用Firebase項目ID作爲Firebox密鑰文件的GCS身份驗證中的ID也失敗。

_(ツ)_ /¯

可能只是在我們的項目設置一個奇怪的行爲,但認爲它有關什麼解決的問題爲我們更新。

使用grll上面提供的格式是:工作的配置是:

const gcs = require('@google-cloud/storage'); 
const storageClient = gcs({ 
    projectId: "this is the GCS project ID, 
    keyFilename: 'this is the firebase admin-sdk keyFilename.json' 
}); 
const bucket = storageClient.bucket(gcsBucket); 
2

另一種方式來解決這個不附加專案編號或的KeyFileName:

  1. 轉到項目的火力地堡控制檯
  2. 設置 - >權限
  3. 應打開IAM選項卡
  4. 現在爲'存儲管理員'角色提供您的'App Engine默認服務帳戶'和'Google API服務帳戶'權限
  5. 現在應該沒問題!
+0

找不到存儲管理員角色。我應該在該角色上創建一個新的基礎,然後將其分配給該帳戶?此外,「Google API服務帳戶」不再存在。 – Xerri

相關問題