Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为数据更改编写firebase函数,将文件写入到一个链式惯用承诺中的云存储桶?_Javascript_Node.js_Firebase_Google Cloud Storage_Google Cloud Functions - Fatal编程技术网

Javascript 如何为数据更改编写firebase函数,将文件写入到一个链式惯用承诺中的云存储桶?

Javascript 如何为数据更改编写firebase函数,将文件写入到一个链式惯用承诺中的云存储桶?,javascript,node.js,firebase,google-cloud-storage,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Storage,Google Cloud Functions,我正在尝试创建一个bucket并将一个文件上传到bucket。最初我有这样的代码: storage .createBucket(bucketName) .upload(tempFilePath) 但这给了我一个错误: TypeError:storage.createBucket(…)。上载不是一个函数 我想这意味着我不了解存储的API。我假设createBucket调用返回“bucket”对象,然后我可以使用该对象上传到它。我是否误用了承诺或误解了存储节点API 谁能帮助我理解如何编写具有以下

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

storage
.createBucket(bucketName)
.upload(tempFilePath)
但这给了我一个错误:

TypeError:storage.createBucket(…)。上载不是一个函数

我想这意味着我不了解存储的API。我假设createBucket调用返回“bucket”对象,然后我可以使用该对象上传到它。我是否误用了承诺或误解了存储节点API

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

  • 如果未创建bucket,请创建它
  • 如果bucket已经存在,不要因为它已经存在而失败,只需跳过createBucket调用
  • 设置bucket(如果需要,看起来在调用其他示例代码中的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 );
        }

我不明白你的问题。您显示的代码有什么问题?使用嵌套承诺似乎很奇怪,我得到了一个关于这一点的警告。但实际上,我只想了解存储API以及它如何与承诺一起工作。似乎可以对其进行优化,因此只有一个catch调用。问题是,当我转到此页面时,我没有看到指向
@google cloud/storage
firebase admin
的API链接(这显然捆绑了该模块)。我在StackOverflow上看到了一些链接,这些链接似乎是针对API的过时版本。我正在试图理解我读到的内容,以了解当前的API。嗯,这看起来很有希望:“云存储使用一个平面名称空间,因此您不能使用已经在使用的名称创建一个bucket。”