如何编写用于数据更改的firebase函数,以一成不变的习惯承诺将文件写入云存储桶?

时间:2018-07-10 17:56:53

标签: javascript node.js firebase google-cloud-storage google-cloud-functions

我正在尝试创建存储桶并将文件上传到存储桶。最初我有这样的代码:

storage
.createBucket(bucketName)
.upload(tempFilePath)

但这给了我错误:

TypeError: storage.createBucket(...).upload is not a function

我认为这意味着我不了解要存储的API。我本以为createBucket调用返回“ bucket”对象,然后可以将其用于上载到该对象。是我滥用承诺还是误解了存储NodeJS API?

谁能帮助我了解如何编写具有以下属性的函数:

  • 如果未创建存储桶,请创建它。
  • 如果存储桶已经存在,请不要失败,因为它已经存在,只需跳过createBucket调用即可。
  • 设置存储桶(如果需要,在其他示例代码中调用upload之前,这看起来是必需的)。
  • 上传文件。
  • 没有嵌套的承诺。

完整的代码在这里:

exports.writeChunk = functions.firestore
    .document('data/{userId}/data/{eventId}/chunks/chunk')
    .onUpdate((change, context) => {
        const projectId = 'chunk-abcdef';
        const Storage = require('@google-cloud/storage');
        const storage = new Storage({
            projectId,
        });

        const data = change.after.data();

        // data = { "chunk" : "abcdef" }
        if( data && data.chunk ) {
            let bucketName = context.params.eventId;
            let fileName = `${context.params.eventId}-${context.params.userId}.txt`;
            const tempFilePath = path.join(os.tmpdir(), fileName);
            console.log( `Writing out to ${tempFilePath}` );
            fs.writeFileSync(tempFilePath, data.chunk );

            storage
                .createBucket(bucketName)
                .then( () =>
                       storage
                       .bucket(bucketName)
                       .upload(tempFilePath)
                       .then( () => fs.unlinkSync(tempFilePath) )
                       .catch( err => console.error('ERROR inside upload', err))
                     )
                .catch(err => console.error('ERROR inside createBucket', err) );
        }
        else {
            console.log( "Nope!", data );
        }

0 个答案:

没有答案