【发布时间】:2017-10-13 05:55:02
【问题描述】:
- 尝试实现:通过firebase云功能从单独的节点提取数据
- Process: onCreate on /users/{uid} ,它给了我一个 managedby 键,我使用它访问另一个 /users/uid。
- 错误:(错误 1):TypeError 无法读取 null 的属性“名称”。 (更新 1):代码有两个问题(a)我没有为 ${managedby} 使用 $ 符号,第二个问题没有在 const managerVal 中使用“.then”。 (错误2):抛出的新错误是:admin.database.ref(..).then 不是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: '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) }) });
错误 2:更新:我使用了@faruk 的方法:
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")
我也试过用.then
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,我已将整个邮件功能放入(复制粘贴)数据库调用中,如您所示。一些非常基本的东西被遗漏了。仍然出现此错误:
错误 2:更新 2:我刚刚使用了 .then,代码是这样的。
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)
这就是它在仪表板中的显示方式(在下面的屏幕截图中给出)。根据它变得多么复杂,我认为它一定是一个真正简单的解决方案。
【问题讨论】:
-
请向我们展示您的用户 json 结构
-
嗨@faruk 有一个更新。这是语法正确的问题。不过我有一个新问题。 ;)
标签: firebase firebase-cloud-messaging google-cloud-functions