Дождитесь окончания операции импорта коллекций Firestore - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующая функция вызываемого облака https, которая импортирует все документы, найденные в резервной копии.

    const client = await auth.getClient();

    const path = `${timestamp}`;

    const projectId = await auth.getProjectId();

    // we change the action for importDocuments
    const url = `https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default):importDocuments`;
    const backup_route = `gs://${BUCKET_NAME}/${path}`;
    return client.request({
        url,
        method: 'POST',
        data: {
            inputUriPrefix: backup_route,
        }
    }).then(async (res) => {
        console.log(`Backup restored from folder ${backup_route}`);
        return Promise.resolve(true);
    }).catch(async (e) => {
        return Promise.reject(new functions.https.HttpsError('internal', e.message));
    })

Проблема заключается в том, что обещание разрешается после успешного начала операции импорта. Но он не ждет окончания импорта.

Я прочитал следующую документацию по импорту и длительным операциям, но не нашел того, что искал. https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases/importDocuments https://firebase.google.com/docs/firestore/reference/rest/Shared.Types/Operation

1 Ответ

0 голосов
/ 10 апреля 2020

Да, так оно и есть. Документы API для importDocuments говорят, что он возвращает Операция . В соответствии с документацией для Операции:

Этот ресурс представляет собой длительную операцию, которая является результатом вызова сетевого API.

Способ чтения API в Как правило, вам нужно взять этот объект Operation и периодически опрашивать его, используя методы для операций . Похоже, get сделает это за вас. Вам нужно будет передать название операции из ее полезной нагрузки, полученной во время звонка, на importDocuments. В конце концов, он даст вам операцию, свойство done которой установлено в true.

Вполне возможно, что импорт займет больше времени, чем ваша функция, поэтому вызывающая сторона вашей функции не будет просто возможность дождаться завершения импорта. Клиенту нужно будет опросить другую функцию, которая продолжает проверять выполнение операции.

...