我想发送触发到pengumuman主题的通知。
export const onNotifPengumuman = functions.database.ref('/pengumuman_course/{course_id_p}/{pengumuman_id}')
.onCreate((snapshot,context) =>{
const course_id_p = context.params.course_id_p;
const pengumuman_id = context.params.pengumuman_id;
const nama_matkul = admin.database().ref('/courses/'+course_id_p+'name').once('value').then(snap =>{
return snapshot.val();
}).catch(error =>
{
console.log(error);
})
console.log(`cobacobacoba ${nama_matkul}`);
return admin.database().ref('pengumuman/' + pengumuman_id + '/').once('value').then(snap =>{
const pengumumanData = snap.val();
const notifDataPengumuman = {
data:{
data_type: "pengumuman ",
title: "Pengumuman Baru", // data bebas (key, value)
body: `${nama_matkul}`, // chatId = const chatId
sound: "default"
}
}
return admin.messaging().sendToTopic(course_id_p, notifDataPengumuman)
.then(function(response) {
console.log("Successfully sent message:", response);
})
.catch(function(error) {
console.log("Error sending message:", error);
});
}).catch(error => {
console.log(error);
})
});
在第一个参考functions.database.ref('/pengumuman_course/{course_id_p}/{pengumuman_id}')
中,我想在Firebase实时数据库中访问并触发这个孩子,下面的代码:
在此处输入图像描述
在此代码return admin.database().ref('pengumuman/' + pengumuman_id + '/')
之后,我将尝试获取有关Pengumuman的所有信息并将其发送给用户。下面的代码: 在此处输入图像描述
但在此之前,我想在数据库中的课程引用中获取pengumuman
名称以获取名称的值,使用以下代码:
const nama_matkul = admin.database().ref('/courses/'+course_id_p+'name').once('value').then(snap =>{
return snapshot.val();
}).catch(error =>
{
console.log(error);
})
在此处输入图像描述
问题是当我使用该代码获取子名并将其存储到 matkul 中时,当我发送/日志时,它会返回 promise 对象。我希望结果显示"REKAYASA PERANGKAT LUNAK"。 谢谢,很抱歉解释不好
[固定]
我正在尝试解决方案并找到此代码
export const onNotifPengumuman = functions.database.ref('/pengumuman_course/{course_id_p}/{pengumuman_id}')
.onCreate((snapshot,context) =>{
const course_id_p = context.params.course_id_p;
console.log(`course id pengumuman ${course_id_p}`);
const pengumuman_id = context.params.pengumuman_id;
admin.database().ref('/courses/' + course_id_p + '/').once('value').then(snap2 =>{
const nama_matkul = snap2.child('name').val();
console.log(`nama matkul dari sini ${nama_matkul}`);
admin.database().ref('pengumuman/' + pengumuman_id + '/').once('value').then(snap =>{
const pengumumanData = snap.val();
const notifDataPengumuman = {
data:{
data_type: "pengumuman",
title: "Pengumuman Baru", // data bebas (key, value)
body: `Judul :${nama_matkul}`, // chatId = const chatId
sound: "default"
}
}
return admin.messaging().sendToTopic(course_id_p, notifDataPengumuman)
.then(function(response) {
console.log("Successfully sent message:", response);
})
.catch(function(error) {
console.log("Error sending message:", error);
});
}).catch(error => {
console.log(error);
})
}).catch(error =>{
console.log(error);
})
});
您需要解析承诺才能获得它们返回的值。你现在正在做的是分配nama_matkul
承诺,但你永远不会等待它完成。
异步/等待
您可以通过将函数定义为异步来使用async
/await
:
.onCreate(async (snapshot,context) =>{
// Your asynchronous code here
}
然后,您可以通过运行 const nama_matkul = (await admin.database((.ref('/courses/'+course_id_p+'name'(.once('value'((.val((;
如果需要处理异常,请包装承诺并在 try catch 块中等待。
重构代码后,它可能如下所示:
export const onNotifPengumuman = functions.database.ref('/pengumuman_course/{course_id_p}/{pengumuman_id}')
.onCreate(async (snapshot,context) => {
try {
const course_id_p = context.params.course_id_p;
const pengumuman_id = context.params.pengumuman_id;
const nama_matkul = (await admin.database().ref('/courses/'+course_id_p+'name').once('value')).val();
console.log(`cobacobacoba ${nama_matkul}`);
const pengumumanData = (await admin.database().ref('pengumuman/' + pengumuman_id + '/').once('value')).val();
const notifDataPengumuman = {
data: {
data_type: "pengumuman ",
title: "Pengumuman Baru", // data bebas (key, value)
body: `${nama_matkul}`, // chatId = const chatId
sound: "default"
}
}
try {
await admin.messaging().sendToTopic(course_id_p, notifDataPengumuman);
console.log("Successfully sent message:", response);
} catch (messageSendError) {
console.log("Error sending message:", messageSendError);
}
} catch (error) {
console.log(error);
}
});
然后/捕获
如果您确实希望坚持使用当前设置并使用回调,则可以保留.then
调用并在回调中处理应用程序逻辑;您的代码可能如下所示:
export const onNotifPengumuman = functions.database.ref('/pengumuman_course/{course_id_p}/{pengumuman_id}')
.onCreate((snapshot,context) => {
const course_id_p = context.params.course_id_p;
const pengumuman_id = context.params.pengumuman_id;
admin.database().ref('/courses/'+course_id_p+'name').once('value')
.then(nameSnapshot => {
const nama_matkul = nameSnapshot.val();
console.log(`cobacobacoba ${nama_matkul}`);
admin.database().ref('pengumuman/' + pengumuman_id + '/').once('value')
.then(dataSnapshot => {
const pengumumanData = dataSnapshot.val();
const notifDataPengumuman = {
data: {
data_type: "pengumuman ",
title: "Pengumuman Baru", // data bebas (key, value)
body: `${nama_matkul}`, // chatId = const chatId
sound: "default"
}
}
return admin.messaging().sendToTopic(course_id_p, notifDataPengumuman)
.then(response => console.log("Successfully sent message:", response))
.catch(error => console.log("Error sending message:", error));
})
.catch(error => console.log(error));
})
.catch(error => console.log(error))
});
当然,如果您愿意,您可以使用then/catch和await的组合,无论这是一种好的做法还是何时使用,这实际上取决于您使用它的情况。