如何仅获得子级Firebase云功能的一个值?

时间:2018-09-18 08:51:07

标签: node.js firebase firebase-realtime-database firebase-cloud-messaging google-cloud-functions

我想发送触发进入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实时数据库中的该孩子,以下代码:

enter image description here

之后,在这段代码return admin.database().ref('pengumuman/' + pengumuman_id + '/')中,我想获得有关pengumuman的所有信息并将其发送给用户。下面的代码: enter image description here

但是在此之前,我想使用数据库代码在课程参考中获取pengumuman名称,以获取name的值,

 const nama_matkul = admin.database().ref('/courses/'+course_id_p+'name').once('value').then(snap =>{

        return snapshot.val();

        }).catch(error =>
             {
        console.log(error);
    })

enter image description here

问题是当我使用该代码获取子名称并将其存储到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);
    })



});

1 个答案:

答案 0 :(得分:0)

您将需要解析promise,以获取promise返回的值。您目前正在做的工作是nama_matkul分配承诺,但是您永远不必等待它完成。

异步/等待
您可以通过将函数定义为异步来使用async / await

.onCreate(async (snapshot,context) =>{
  // Your asynchronous code here
}

然后您可以通过运行以下命令来兑现承诺     const nama_matkul =(等待admin.database()。ref('/ courses /'+ course_id_p +'name')。once('value'))。val();

如果您需要处理异常,请包装promise并在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的组合,这是一个好习惯还是何时使用,这实际上取决于您使用它的情况。