随着firebase云功能的引入,我们正在考虑将当前的node.js服务器端代码迁移到云功能。我遇到的一个问题是从gcs bucket下载一个文件到磁盘上的临时文件,然后将其作为附件(使用mailgun js)通过电子邮件发送。
让我伤心的代码是:

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)

我可以使用request将文件下载到磁盘上的/tmp/文件夹,这将是回退选项,但如果可能的话,我真的很想使用gcs工具。我“认为”这是GCS的授权错误,但我不确定如何追踪。我需要在gcs的cloud functions.config()中使用不同于firebase的auth参数吗?如果是,我如何进入它们?我们的gcs bucket和project为firebase storage的引入提供了先期,但我们已经成功地将其用于服务器上运行的节点功能。
提前谢谢你,
扎克

最佳答案

解决:最终解决了上述问题。问题是@google cloud/storage auth需要gcs项目id作为id,但需要firebase admin sdk密钥文件,而不是gcs项目密钥文件。在带有firebase密钥文件的gcs的auth中使用firebase项目id作为id也失败了。
?(12484;)?/
可能只是在我们的项目设置中有一个奇怪的行为,但认为它与更新为我们解决问题的内容相关。
使用上述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);

关于node.js - Google Cloud Storage的firebase云功能API错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43044835/

10-12 06:12