Firebase云函数报错:Function returned undefined, expected Promise or value
解决Firebase云函数返回undefined的问题
这个错误我之前也踩过坑!根源在于你的云函数在执行异步邮件发送逻辑时,没有返回Promise,Firebase云函数要求所有包含异步操作的函数必须返回一个Promise或者明确的值,这样它才能知道异步任务什么时候完成,否则函数会提前结束并返回undefined,触发你看到的错误。
具体问题分析
当newDoc.hasFailed为true时,你执行了userDatabase.get()的链式调用,但没有把这个Promise返回出去,函数执行到这里就直接结束了,返回了undefined。另外还有几个小问题需要修正:
- 变量
newDoc和data没有用const/let声明,会变成全局变量,存在风险 mailTransport.sendMail()在then里没有return,导致前面的Promise链不会等待邮件发送完成- 错误日志里的
+ error是语法错误,会把错误对象转成NaN,应该直接传入error参数
修改后的完整代码
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); const nodemailer = require('nodemailer'); // Configure the email transport using the default SMTP transport const gmailEmail = functions.config().gmail.email; const gmailPassword = functions.config().gmail.password; const mailTransport = nodemailer.createTransport({ service: 'gmail', auth: { user: gmailEmail, pass: gmailPassword } }); exports.checkForFails = functions.firestore .document('equipment/{itemId}') .onUpdate(event => { // 加上const声明变量 const newDoc = event.data.data(); if(newDoc.hasFailed){ const mailOptions = { from: '"Emailer" <noreply@firebase.com>', to: "desination@email.com" }; const userDatabase = admin.firestore().doc('users/' + newDoc.user); // 这里要return整个Promise链 return userDatabase.get().then(function(snap){ // 加上const声明 const data = snap.data(); mailOptions.subject = ('Text Subject' + data.subject); mailOptions.text = ('Text body' + data.body); }) .then(() => { // return sendMail的Promise,让链等待它完成 return mailTransport.sendMail(mailOptions) .then(() => console.log('Notification sent to WFE email')) .catch(error => console.log('There was an error sending email', error)) }) .catch(error => { console.log('Couldnt send mail', error); // 可以在这里抛出错误,让云函数标记为失败(可选) // throw error; }) }else { return 0; } })
关键修改点
- 返回Promise链:在
userDatabase.get()前加上return,让云函数等待整个异步流程完成 - 变量声明:给
newDoc和data加上const,避免全局变量污染 - return sendMail结果:在第二个then里return
mailTransport.sendMail()的Promise,确保邮件发送完成后才结束函数 - 修复错误日志:去掉
+ error,直接打印错误对象,方便排查问题
这样修改后,你的云函数就会正确返回Promise,控制台的错误提示应该就消失了,邮件发送逻辑也能正常完成。
内容的提问来源于stack exchange,提问作者juicy89
相关产品推荐
相关产品推荐

