Я создал облачную функцию для запуска файлов в хранилище.
Тип триггера: Облачное хранилище
Тип события: Завершить / Создать
Затем, если файл загружен в корзину, облачная функция вставит запись (ключ: местоположение) в имя_таблицы в хранилище данных.
Требуется обновить запись, если файл удален. Итак, я создал еще одну облачную функцию с типом события «Удалить». Другая облачная функция скопирует свойства записи, чтобы вставить новую запись (ключ: uuid) и удалить старую.
Эти функции работают хорошо. Однако, когда я заменяю одноименный файл, он вызывает функцию «Удалить» и «Завершить / Создать» почти одновременно. То, что я нашел в table_name в хранилище данных, это только новая запись (key: uuid), что означает, что я потерял запись (key: location).
Я пытаюсь добавить код для задержки при вставке записи (ключ: местоположение), если загружен. Это всегда работает, но иногда терпит неудачу.
Или мне нужно знать, как использовать транзакцию, чтобы убедиться, что сначала выполняется действие удаления, а затем действие вставки. Я действительно не знаю транзакции.
Функция Cloud (node.js8) для загрузки файлов:
'use strict';
exports.upload = async (event, context) => {
const processingFile = event.name;
console.log(` Created: ${event.timeCreated}`);
let data = {
property_a: '',
property_b: '',
location: processingFile
};
try {
// await delay(5000);
await insertData(data);
} catch (err) {
console.error(err);
}
};
const delay = ms => new Promise(res => setTimeout(res, ms))
async function insertData(data) {
const datastore = new Datastore({projectId: projectId, namespace: namespace});
let name = data.location;
const taskKey = datastore.key(['table_name', name]);
// Prepares the new entity
const task = {
key: taskKey,
data: data
};
// Saves the entity
await datastore.save(task);
console.log(`Save ${task.key.name}: ${task.data.location}`);
}
Это не всегда работает, и я не хочу ждать этого.
Облачная функция (python3.7) для удаления файлов:
def delete(event, context):
try:
if: # Exclude folders
key_name = event['name']
update(project_id, namespace, key_name)
except Exception as e:
print("Error: " + str(e))
def update(project_id, namespace, entityName):
from google.cloud import datastore
client = datastore.Client(project=project_id, namespace=namespace)
import datetime
with client.transaction():
key = client.key('table_name', entityName)
task = client.get(key)
if not task:
raise Exception("The entity does not exist.")
# Copy the record
# Insert a record(key: uuid) with auto-incrementing id
incomplete_key = client.key('table_name')
uuid_task = datastore.Entity(key=incomplete_key)
data_properties = ['property_a', 'property_b', 'location']
for data_property in data_properties:
if data_property in task:
uuid_task.update({
data_property : task[data_property]
})
client.put(uuid_task)
# Delete the record(key: location)
client.delete(key)
Следующая запись (ключ: местоположение):
Кажется, я копирую запись и заменяю ее, а затем удаляю запись.
Чего я хочу добиться, так это скопировать запись и удалить ее, а затем вставить новую запись.
Не могли бы вы дать мне какое-нибудь предложение?