Firebase Cloud Function 在 .get() 完成之前结束
Posted
技术标签:
【中文标题】Firebase Cloud Function 在 .get() 完成之前结束【英文标题】:Firebase Cloud Function ends before .get() finishes 【发布时间】:2019-12-05 14:26:58 【问题描述】:我正在尝试在 Firestore 中获取()具有特定字段值的所有用户。然后将它们放在一个列表中,以便能够向所有人发送电子邮件。但是由于某种原因,在找到所有电子邮件之前,该功能会一直结束(根据日志)。
我还收到以下错误: 函数返回未定义的、预期的 Promise 或值
这是我的代码:
exports.stuurJuisteTekenaarUpdate =
functions.firestore.document('opdrachten/opdrachtId').onCreate((snap, context) =>
const nieuweOpdracht = snap.data()
console.log(nieuweOpdracht.disciplines);
let tekenaarsRef = db.collection('tekenaars');
let alleTekenaars = tekenaarsRef.where('disciplines', '==', nieuweOpdracht.disciplines).get().then(snapshot =>
const promises = [];
snapshot.forEach(doc =>
const p = doc.data().email
console.log(p);
promises.push(p)
)
return Promise.all(promises)
)
//return null
);
使用最后的“return null”可以使警告静音,但不能解决函数在收到电子邮件地址之前结束的问题。
一旦解决了这个问题,我想运行以下代码:
.then(emailAdressen =>
// getting dest email by query string
const dest = 'vaneijkchris@gmail.com';
const mailOptions =
from: 'CAD-Tekenaar.com <info@cad-tekenaar.com>',
//to: emailAdressen,
bcc: emailAdressen,
subject: `Er is een nieuw tekenproject aangemeld - CDT.$nieuweOpdracht.opdrachtnummerjaar.$nieuweOpdracht.opdrachtnummer`, // email subject
html: `
<p style="font-size: 16px;font-weight: 600;">NIEUW TEKENPROJECT AANGEMELD</p>
<div style="height: 2px;background-color: #144b89; width: 100%;margin-bottom: 20px;"></div>
<p style="font-size: 16px;font-weight: 600;">Beste tekenaar,</p>
<p style="font-size: 16px;">Er is vandaag een nieuwe opdracht binnengekomen binnen jouw vakgebied.<br>Als je interesse hebt wil je mij een mail sturen?<br></p>
<p style="font-size: 16px;"><br>Discipline: $nieuweOpdracht.disciplines</p>
<p style="font-size: 16px;">Tekenprogramma: $nieuweOpdracht.tekenprogramma</p>\
<p style="font-size: 16px;">Opdrachtomschrijving:<br> $nieuweOpdracht.omschrijving</p>\
<br>
<p>Interesse in deze opdracht? Reageer dan op deze email.</p>
`
// email content in HTML
;
// returning result
return transporter.sendMail(mailOptions, (erro, info) =>
if(erro)
return res.send(erro.toString());
return Promise.all(res.send('Sended'));
);
return Promise.all()
)
.catch(error =>
console.log(error);
response.status(500).send(error)
)
【问题讨论】:
【参考方案1】:您没有从函数回调的顶层返回一个承诺。这是必需的,以便 Cloud Functions 知道所有异步工作何时完成并且可以安全清理。试试这个:
return tekenaarsRef.where('disciplines', '==', nieuweOpdracht.disciplines).get().then(snapshot =>
const promises = [];
snapshot.forEach(doc =>
const p = doc.data().email
console.log(p);
promises.push(p)
)
return Promise.all(promises)
)
请read the documentation了解更多信息。
【讨论】:
以上是关于Firebase Cloud Function 在 .get() 完成之前结束的主要内容,如果未能解决你的问题,请参考以下文章
在 TypeScript 中为 Firebase Cloud Function 配置 mailgun
在 Firebase Cloud Function 中发出 Youtube Data API 请求
从请求中获取用户信息到 Firebase 中的 Cloud Function
Firebase:Firestore 未在 Cloud Function 的计划函数中更新数据