使用云功能在文件中添加或删除数据

时间:2018-05-25 22:20:59

标签: firebase google-cloud-functions google-cloud-storage

我的想法是能够编辑存储中的文件。 此版本包括根据firebase触发器添加或删除文件数据。

我在使用bucket.file function ("file.txt"). CreateReadStream ()获取文件后在firebase中创建了一个触发器 然后我在firebase中更改了基础中的数据,之后我用该函数更新了文件 B ucket.file ("file.txt"). createWriteStream ()。 当有1个触发器时,此解决方案很好,但是当有超过2个触发器时,数据无法正确保存文件被其之前的数据覆盖的原因。

实施例

这是file.txt的内容

  

这是一个例子

并执行了2个触发器 2个激活器同时获取文件,第一个触发器添加数据并使用此消息覆盖文件

  

这个文本是一个例子

     

并使用第一个触发器

编辑了此文件

并且第二个激活器使用此消息擦除数据并覆盖文件

  

本文

当触发器完成时,文件有"此文本" 但是这个文件必须有

  

本文

     

并使用第一个触发器

编辑了此文件

有人帮助我。

exports.createData = functions.database.ref('data/{id}/summary/status').onCreate((data, context) => {
    let status = data._data;
    return Promise.all([ admin.database().ref('data/' + context.params.id + '/summary/entityUrl').once('value', (snapshot) => {
        let entityUrl = snapshot.val(); 
        if (isDataValid(status))
            return  addDataFile(entityUrl) ;
        return; 
    }) ]);  
})
function addDataFile(entityUrl){
    return Promise.all([ returnFile("txt",() => {
        dataFile.splice(dataFile.length - 1, 0, `new data ${entityUrl}`)
        updateFileStorage("txt", dataFile.join('\n'));  
    }) ]);

}
function returnFile(extension, callback) {
    let respData = "";
    if (dataFile == null ){
        return bucket.file(FileUrl + extension).createReadStream()
            .on('data', (chunk) => {
                respData += chunk;
            })
            .on('end', () => {
                dataFile = respData.split('\n');
                callback();
            })
            .on('error', (error) => {
                console.log("Error en lectura")
                return returnFile(extension, callback);
            })
    }
    else callback();
    return;
}
function updateFileStorage(extension,data, trys ){
    trys = typeof trys !== 'undefined' ? trys : 0;
    if(trys>6)
        return;
    var s = new Readable();
    s._read = function noop() { };
    s.push(data);
    s.push(null);
    return s.pipe(bucket.file(FileUrl + extension).createWriteStream())
        .on('finish', function () {
            //console.log("File updated");
            return;
        })
        .on('error', function (err) {
            console.log("Error de Escritura");
            return setTimeout(() => {
                return updateFileStorage(extension, data, trys + 1)
            }, 250);
        })
}

0 个答案:

没有答案