错误 snap.data 不是带有 firebase 云函数和 onCreate 的函数
Error snap.data is not a function with firebase cloud function and onCreate
我有一个云功能,每次新用户在数据库中注册时都会发送一封欢迎电子邮件。
该函数正确执行所有操作,发送电子邮件,收件人收到这些电子邮件,到目前为止,一切正常。
当我在函数中手动写入电子邮件地址时它可以工作,但是当我希望它从实时数据库中获取数据时,它会给我错误:
TypeError: snap.data 不是函数
这是我的函数代码:
const functions = require('firebase-functions');
const nodemailer = require("nodemailer");
const transport = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "MY_EMAIL",
pass: "MY_EMAIL_PASSWORD"
}
})
exports.welcomeMail = functions.database.ref('/paso1/{id}').onCreate((snap, context) => {
const _name = snap.data().name;
return sendWelcomeMail(_name)
});
// aux functions
function sendWelcomeMail(name) {
return transport.sendMail({
from: "JohnDoe <sender@test.com>",
to: "myfriendemail@gmail.com",
subject: "Hello",
html: `
<h1<Hello ${name} </h1>
<p>nice to seeyou</p>
`
})
.then(r => r)
.catch(e => e);
}
这是我的实时数据库:
我已经多次查看文档,我已经用 snap.val().{uid};
进行了测试,但都没有成功,我无法从数据库中恢复 "name" 字段。
使用const _name = snap.val().name;
我得到同样的错误
我不确定是什么问题。
你打错了。您声明 snap
,然后将其引用为 snapshot
。要解决此问题,请确保声明和使用匹配。
您还在使用 snapshot.data()
,而实时数据库快照中不存在 data()
(您可能将其与 Cloud Firestore 混淆了)。
所以结合这两个修复,这应该更接近:
exports.welcomeMail = functions.database.ref('/paso1/{id}')
.onCreate((snapshot, context) => { // this line changed
const _name = snapshot.val().name;
...
您要查找的方法是 snap.val()
,而不是 snap.data()
。您可能会将实时数据库与 Firestore 混淆。 Firestore 使用 data() 从 DocumentSnapshot 中获取原始数据,但这与实时数据库不同。
终于找到问题所在了。
事实上,正如您向我指出的那样,从实时数据库中提取数据的正确方法是使用 .val()
但是,我在对答案的评论中告诉你我一直返回错误。
它没有用,因为我没有将 firebase SDK 初始化为管理员,这是访问实时数据库所必需的。
https://firebase.google.com/docs/admin/setup
我希望我的错误会节省其他程序员的时间。
感谢大家的帮助
我有一个云功能,每次新用户在数据库中注册时都会发送一封欢迎电子邮件。
该函数正确执行所有操作,发送电子邮件,收件人收到这些电子邮件,到目前为止,一切正常。
当我在函数中手动写入电子邮件地址时它可以工作,但是当我希望它从实时数据库中获取数据时,它会给我错误:
TypeError: snap.data 不是函数
这是我的函数代码:
const functions = require('firebase-functions');
const nodemailer = require("nodemailer");
const transport = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "MY_EMAIL",
pass: "MY_EMAIL_PASSWORD"
}
})
exports.welcomeMail = functions.database.ref('/paso1/{id}').onCreate((snap, context) => {
const _name = snap.data().name;
return sendWelcomeMail(_name)
});
// aux functions
function sendWelcomeMail(name) {
return transport.sendMail({
from: "JohnDoe <sender@test.com>",
to: "myfriendemail@gmail.com",
subject: "Hello",
html: `
<h1<Hello ${name} </h1>
<p>nice to seeyou</p>
`
})
.then(r => r)
.catch(e => e);
}
这是我的实时数据库:
我已经多次查看文档,我已经用 snap.val().{uid};
进行了测试,但都没有成功,我无法从数据库中恢复 "name" 字段。
使用const _name = snap.val().name;
我得到同样的错误
我不确定是什么问题。
你打错了。您声明 snap
,然后将其引用为 snapshot
。要解决此问题,请确保声明和使用匹配。
您还在使用 snapshot.data()
,而实时数据库快照中不存在 data()
(您可能将其与 Cloud Firestore 混淆了)。
所以结合这两个修复,这应该更接近:
exports.welcomeMail = functions.database.ref('/paso1/{id}')
.onCreate((snapshot, context) => { // this line changed
const _name = snapshot.val().name;
...
您要查找的方法是 snap.val()
,而不是 snap.data()
。您可能会将实时数据库与 Firestore 混淆。 Firestore 使用 data() 从 DocumentSnapshot 中获取原始数据,但这与实时数据库不同。
终于找到问题所在了。
事实上,正如您向我指出的那样,从实时数据库中提取数据的正确方法是使用 .val()
但是,我在对答案的评论中告诉你我一直返回错误。
它没有用,因为我没有将 firebase SDK 初始化为管理员,这是访问实时数据库所必需的。
https://firebase.google.com/docs/admin/setup
我希望我的错误会节省其他程序员的时间。
感谢大家的帮助