Я пытаюсь собрать все документы из определенного файла и преобразовать их в объект вложения Sendgrid со свойством content и filename.
Шаг 1 и 2 работают. После шага 2 у меня есть массив объектов с некоторыми данными документа, такими как имя файла, тип, URL хранилища и т. Д.
На шаге 3 я хочу получить фактический файл на основе URL-адреса хранилища и создать объект вложения Sendgrid. В качестве свойств требуется content
и filename
.
Однако, с моим текущим кодом, массив вложений остается пустым, когда я регистрирую переменную.
Мой код:
export const onStatusChanged = functions.database.ref(`files/{fileID}/general/status`).onUpdate(async (change, context) => {
const prevStatus = change.before.val();
const currentStatus = change.after.val();
if (prevStatus === currentStatus) return null;
if (currentStatus === 'email') {
// 1. Get file data
const snapshot = await change.after.ref.parent.parent.once('value');
const file = snapshot.val();
// 2. Get documents
const documents = getDocuments(file.documents);
console.log(documents);
// 3. Create attachments
const attachments = [];
documents.forEach(document => {
axios.get(document.url, { responseType: 'arraybuffer' }).then(image => {
attachments.push({ content: Buffer.from(image.data).toString('base64'), filename: document.name });
}).catch(error => {
console.log(error)
})
});
console.log(attachments) // []
// 4. Create email object
// 5. Send email
}
return null;
})
Я думал, используя обещание, мой код синхронен?
РЕДАКТИРОВАТЬ: сначала у меня был этот код
// 3. Create attachments
const attachments = documents.map(document => {
const image = await axios.get(document.url, { responseType: 'arraybuffer' });
return attachments.push({ content: Buffer.from(image.data).toString('base64'), filename: document.name });
})
console.log(attachments) // [ Promise { <pending> } ]