Моя идея состоит в том, чтобы иметь возможность редактировать файлы в хранилище.Эта редакция состоит из добавления или удаления данных файла в соответствии с триггером firebase.
Я создал триггер в firebase после получения файла с bucket.file function ("file.txt"). CreateReadStream ()
и отредактировал данные в базе при изменении.после этого я обновил файл с помощью функции 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);
})
}