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