Ошибка Firestore: 4 Deadline_Exceeded только при использовании Promise.All () - PullRequest
0 голосов
/ 07 мая 2020

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

const uploader = async function(data, path, filenames) {
    let batches = [];
    let batch = admin.firestore().batch()
    var count = 0

    for (let i = 0; i < data.length; i++) {
        const documentRef = firestore.doc(path+filenames[i])
        batch.set(documentRef, data[i], {merge: true})
        if (++count >= 500 || i == data.length-1) {
            batches.push(batch.commit())
            batch = admin.firestore().batch()
            count = 0
        }
    }

    await Promise.all(batches)
    .then(() => {
        console.log('Documents in batch successfully written')
        return;
    })
    .catch(err => {
        console.log(
            'Error writing the documents: ',
            err,
            '\nFor target',
            path
        )}
    )
}

Однако при использовании приведенного выше кода возникает следующая ошибка.

Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
    at Object.callErrorFromStatus (/srv/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
    at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/client.js:96:33)
    at emitOne (events.js:121:20)
    at Http2CallStream.emit (events.js:211:7)
    at process.nextTick (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:100:22)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  code: 4,
  details: 'Deadline exceeded',
  metadata: Metadata { internalRepr: Map {}, options: {} } } 

Это происходит только при наличии более 3 пакетов (т. Е. 1500 документов). Я также попытался написать код, чтобы пакеты выполнялись последовательно, как показано ниже:

    for (let i = 0; i < data.length; i++) {
        const documentRef = firestore.doc(path+filenames[i])
        batch.set(documentRef, data[i], {merge: true})
        if (++count >= 500 || i == data.length-1) {
            await batch.commit()
            batch = admin.firestore().batch()
            count = 0
        }
    }

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

Я предположил, что достигаю какого-то предела, когда использую обещание .все(). Однако я не уверен, как я могу это исправить, потому что выполнение этого последовательно, похоже, также приводит к тайм-ауту функции. Есть ли у кого-нибудь идеи, что я могу сделать?

...