火力地堡云功能:从不同的节点
- 访问数据试图实现:从经由火力云功能 一个单独的节点提取数据
- 过程:的onCreate上/用户/ {UID},这使我一个managedby密钥,使用它我访问另一个/ users/uid。
- 错误:(错误1):TypeError无法读取null的属性'name'。 (更新1):代码有两个问题(a)我没有在$ {managedby}中使用$符号,而第二个在const managerVal中没有使用“.then”。 (错误2):抛出的新错误是:admin.database.ref(..)。然后不是一个函数在exports.sendWelcomeEmail ...我读过其他地方,我们不应该使用admin之间的函数。什么是替代呢?错误3:请看下面的错误2更新。我认为这一定是小事情造成的。
-
名称的值为。这里有什么根本性的错误吗? (清除读取,更新,1)火力地堡云功能:从不同的节点
admin.initializeApp(functions.config().firebase); // // Create and Deploy Your First Cloud Functions // // https://firebase.google.com/docs/functions/write-firebase-functions // // exports.helloWorld = functions.https.onRequest((request, response) => { // response.send("Hello from Firebase!"); // }); exports.sendWelcomeEmail = functions.database.ref('/users/{uid}').onWrite(event => { if (!event.data.exists() || event.data.previous.exists()) { return; } var user = event.data.val() var {email} = user var {managedby} = user const managerVal = admin.database().ref(`/users/{managedby}`).on('value', function(snapshot){ const managedByName = snapshot.val().name const managedByMobile = snapshot.val().mobile }); console.log(email) var data = { from: '[email protected]', 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) }) });
错误2:更新:我已经使用@法鲁克的方法:
var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
const managerVal = db.ref('/users/' + managedby).on('value', function(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")
我也曾尝试使用。于是
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")
现在的问题是,“功能外”部分先被触发,然后“功能内”部分被触发。在它离开之前,它是否在第一个完成的功能中执行?我不知道问题在哪里。
编辑:法鲁克,我已经把(复制粘贴)你有节目数据库调用内的整个邮件功能。一些非常基本的东西正在被遗漏。仍然得到这个错误:
错误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: '[email protected]',
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)
})
});
});
on Value
始终异步工作
有没有管理数据库模块?我现在检查这个[编辑]对不起,我的坏。 – user165242
嗨@faruk,我根据我得到的更新了错误。 – user165242
我已经更新了我的答案,'Value'事件是异步查询数据库的,所以如果你需要在查询过程后执行一些操作,你需要把它放在函数内部(快照) – faruk
,请告诉我们您的用户JSON结构 – faruk
喜@faruk出现了更新。它是一个问题与正确的语法。但我有一个新问题。 ;) – user165242