Firebase云功能[错误:超出内存限制。函数调用被中断。]在youtube视频上载

时间:2018-11-13 16:11:28

标签: node.js firebase google-cloud-functions youtube-data-api

我正尝试使用Firebase云功能将视频上传到youtube。

我需要的是,当用户将视频上传到Firebase云存储时,functions.storage.object()。onFinalize事件将被触发,并且在该事件中,我将文件存储到一个临时位置并将文件上传到youtube从临时位置到youtube,在上传后我删除了这两个文件。

对于小文件,它可以正常工作。

但是,如果我上传了一个大文件,则该功能会由于显示此错误而终止

错误:超出内存限制。函数调用被中断。

上传视频的代码

   var requestData = {
        'params': {
        'part': 'snippet,status'
        },
        'properties': {
        'snippet.categoryId': '22',
        'snippet.defaultLanguage': '',
        'snippet.description': "docdata.shortDesc",
        'snippet.tags[]': '',
        'snippet.title': "docdata.title",
        'status.embeddable': '',
        'status.license': '',
        'status.privacyStatus': 'public',
        'status.publicStatsViewable': ''
        }, 'mediaFilename': tempLocalFile
    };

    insertVideo(tempLocalFile, oauth2Client, requestData);

插入视频功能

function insertVideo( file, oauth2Client, requestData) {
    return new Promise((resolve,reject)=>{
        google.options({ auth: oauth2Client });
        var parameters = removeEmptyParameters(requestData['params']);
        parameters['auth'] = oauth2Client;
        parameters['media'] = { body:  fs.createReadStream(requestData['mediaFilename'])};
        parameters['notifySubscribers'] = false;
        parameters['resource'] = createResource(requestData['properties']);

        console.log("INSERT >>> ");
        let req = google.youtube('v3').videos.insert(parameters,  (error, received)=> {
            if (error) {
                console.log("in error")
                console.log(error);
                try {
                    fs.unlinkSync(file);
                } catch (err) {
                    console.log(err);
                } finally{
                    // response.status(200).send({ error: error })
                }
                reject(error)
            } else {
                console.log("in else")
                console.log(received.data)
                fs.unlinkSync(file);
                resolve();
            }
        }); 
    })

}

用于创建临时本地文件的代码

           bucket.file(filePath).createReadStream()
            .on('error', (err)=> {
                reject(err)
            })
            .on('response', (response)=> {
                console.log(response)
            })
            .on('end', ()=> {
                console.log("The file is fully downloaded");
                resolve();
            })
            .pipe(fs.createWriteStream(tempLocalFile));

每个文件的读写都由流处理,任何关于为什么发生内存问题的想法

1 个答案:

答案 0 :(得分:1)

Cloud Functions中文件系统的唯一可写部分是/tmp目录。根据文档here

  

这是一个本地磁盘安装点,称为“ tmpfs”卷,其中   写入卷的数据存储在内存中。请注意,它将   消耗为该功能配置的内存资源。

这就是为什么您使用更大的文件达到内存限制的原因。

您的选择是:

  • 为您的功能分配更多内存(当前最多2 GB)
  • 从可以写入文件系统的环境中执行上载。例如,您的Cloud Function可以调用App Engine Flexible服务来执行上传。