Firebase云功能:从不同节点访问数据 尝试实现:通过firebase云函数从单独的节点提取数据 进程:onCreate on/users/{uid},这给了我一个managedby键,我使用它访问另一个/users/uid 错误:(错误1):TypeError无法读取null的属性“name”。(更新1):代码有两个问题(a)我没有为${managedby}使用$符号,第二个没有在const managerVal中使用“.then”。(错误2):引发的新错误是:admin.database.ref(..)。然后不是exports.sendWelcomeEmail的函数。。。我在别处读到,我们不应该在函数之间使用admin。那么,还有什么选择呢?错误3:查看下面的错误2更新。我想一定是小东西引起了这一切
名称有一个值。这里有什么根本的问题吗?(已清除。读取更新1) 我也试过用。然后呢Firebase云功能:从不同节点访问数据 尝试实现:通过firebase云函数从单独的节点提取数据 进程:onCreate on/users/{uid},这给了我一个managedby键,我使用它访问另一个/users/uid 错误:(错误1):TypeError无法读取null的属性“name”。(更新1):代码有两个问题(a)我没有为${managedby}使用$符号,第二个没有在const managerVal中使用“.then”。(错误2):引发的新错误是:admin.database.ref(..)。然后不是exports.sendWelcomeEmail的函数。。。我在别处读到,我们不应该在函数之间使用admin。那么,还有什么选择呢?错误3:查看下面的错误2更新。我想一定是小东西引起了这一切,firebase,firebase-cloud-messaging,google-cloud-functions,Firebase,Firebase Cloud Messaging,Google Cloud Functions,名称有一个值。这里有什么根本的问题吗?(已清除。读取更新1) 我也试过用。然后呢 var user = event.data.val(); var email = user.email; var managedby = user.managedby; const managerVal = db.ref('/users/' + managedby).once('value') .then((snapshot) => { console.log("inside the func
var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
const managerVal = db.ref('/users/' + managedby).once('value')
.then((snapshot) => {
console.log("inside the function")
const managerUser = snapshot.val();
if(managerUser)
{
const managedByName = managerUser.name;
const managedByMobile = managerUser.mobile;
}
});
console.log("outside the function")
现在的问题是,先触发“函数外部”部分,然后触发“函数内部”部分。函数中的执行不是在它离开之前首先完成的吗?我不知道问题出在哪里
编辑:Faruk,我已经在数据库调用中放置(复制粘贴)了整个mailer函数,如您所示。一些非常基本的东西被遗漏了。仍然会出现此错误:
错误2:更新2:我刚用过。然后代码是这样的
var db = admin.database();
if (!event.data.exists() || event.data.previous.exists()) {
return;
}
var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
console.log(managedby)
const managerVal = db.ref('/users/' + managedby).once('value')
managerVal.then((snapshot) => {
const managerUser = snapshot.val()
console.log("inside snapshot")
if (managerUser) {
console.log("deep inside snapshot")
const managedByName = managerUser.name
const managedByMobile = managerUser.mobile
}
})
console.log("outside snapshot")
console.log('managerName = ' + managedByName)
console.log('email = ' + email)
这就是它在仪表板中的特性(在下面的屏幕截图中给出)。考虑到它变得多么复杂,我认为它一定是一个真正简单的解决方案
可能是这样的:
const admin = require('firebase-admin');
var serviceAccount = require("./serviceAccountKey.json");
//just called once
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://[your_project_id].firebaseio.com"
});
exports.sendWelcomeEmail = functions.database.ref('/users/{uid}').onCreate(event => {
var db = admin.database();
if (!event.data.exists() || event.data.previous.exists()) {
return;
}
var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
const managerVal = db.ref('/users/' + managedby).on('value', function(snapshot){
const managerUser = snapshot.val();
var managedByName;
var managedByMobile;
if(managerUser)
{
managedByName = managerUser.name;
managedByMobile = managerUser.mobile;
}
console.log('managerName = ' + managedByName);
console.log('email = ' + email);
var data = {
from: 'no-reply@firebaseapp.com',
subject: 'From Your Admin! Please set your Password for your account',
html: `<p> hello</p>`,
to: email
}
mailgun.messages().send(data, function (error, body) {
console.log(body)
})
});
});
const admin=require('firebase-admin');
var servicecomport=require(“./servicecomportkey.json”);
//刚打过一次电话
admin.initializeApp({
凭证:管理员凭证证书(serviceAccount),
databaseURL:“https://[your_project_id].firebaseio.com”
});
exports.sendWelcomeEmail=functions.database.ref('/users/{uid}').onCreate(事件=>{
var db=admin.database();
如果(!event.data.exists()| | event.data.previous.exists()){
返回;
}
var user=event.data.val();
var email=user.email;
var managedby=user.managedby;
const managerVal=db.ref('/users/'+managedby).on('value',函数(快照){
const managerUser=snapshot.val();
var-managedByName;
var-managedByMobile;
if(managerUser)
{
managedByName=managerUser.name;
managedByMobile=managerUser.mobile;
}
log('managerName='+managedByName);
console.log('email='+email);
风险值数据={
发信人:“没有-reply@firebaseapp.com',
主题:“来自您的管理员!请为您的帐户设置密码”,
html:`你好`,
收件人:电子邮件
}
mailgun.messages().send(数据、函数(错误、正文){
控制台日志(正文)
})
});
});
在值上
始终异步工作请向我们显示您的用户json structureHi@faruk有一个更新。。这是正确语法的问题。不过我有一个新问题是否有管理数据库模块?我现在会检查这个抱歉我的错误。嗨@faruk,我已经根据我得到的更新了错误。我已经更新了我的答案,on Value
事件正在异步查询数据库,所以如果您需要在查询过程后执行一些操作,您需要将其放在函数(快照)中,并尝试这样做。仍然会得到一个错误。我已经发布了屏幕截图。嗨。成功了!谢谢顺便说一句,我得问问。。修改的内容是什么?您已经设置了var managedByName;var-managedByMobile;之前还有别的吗?
var db = admin.database();
if (!event.data.exists() || event.data.previous.exists()) {
return;
}
var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
console.log(managedby)
const managerVal = db.ref('/users/' + managedby).once('value')
managerVal.then((snapshot) => {
const managerUser = snapshot.val()
console.log("inside snapshot")
if (managerUser) {
console.log("deep inside snapshot")
const managedByName = managerUser.name
const managedByMobile = managerUser.mobile
}
})
console.log("outside snapshot")
console.log('managerName = ' + managedByName)
console.log('email = ' + email)
const admin = require('firebase-admin');
var serviceAccount = require("./serviceAccountKey.json");
//just called once
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://[your_project_id].firebaseio.com"
});
exports.sendWelcomeEmail = functions.database.ref('/users/{uid}').onCreate(event => {
var db = admin.database();
if (!event.data.exists() || event.data.previous.exists()) {
return;
}
var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
const managerVal = db.ref('/users/' + managedby).on('value', function(snapshot){
const managerUser = snapshot.val();
var managedByName;
var managedByMobile;
if(managerUser)
{
managedByName = managerUser.name;
managedByMobile = managerUser.mobile;
}
console.log('managerName = ' + managedByName);
console.log('email = ' + email);
var data = {
from: 'no-reply@firebaseapp.com',
subject: 'From Your Admin! Please set your Password for your account',
html: `<p> hello</p>`,
to: email
}
mailgun.messages().send(data, function (error, body) {
console.log(body)
})
});
});