我的想法是能够编辑存储中的文件。 此版本包括根据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);
})
}