首页 > 解决方案 > OnCreate 函数未触发但 OnWrite 函数触发

问题描述

我有一个 oncreate 函数,当我在实时数据库中创建数据时,它似乎不会触发。我了解在实时数据库中创建新数据时会使用 onCreate。请参阅下面的代码。

我究竟做错了什么?

exports.getNewReport = 
functions.database.ref('/Hotel_Complaints/Users/{usersId}/')
.onCreate((snapshot, context) => {
  // Grab the current value of what was written to the Realtime Database.
  var user_id = context.params.usersId;
console.log(user_id);
// Grab the current value of what was written to the Realtime Database.
var eventSnapshot = snapshot.val();

var device_token = admin.database().ref('/Hotel_Staff/'+user_id+'/device_token').once('value');

return device_token.then(result => {

var token_id = result.val();

console.log(token_id);

var str = eventSnapshot.issue_description;

var payload = {
    notification: {
        title: "New complaint",
        body: "New complaint for your department",

    }   

};

// Send a message to devices subscribed to the provided topic.
return admin.messaging().sendToDevice(token_id, payload).then(function (response) {
        // See the MessagingTopicResponse reference documentation for the
        // contents of response.
        console.log("Successfully sent message:", response);
        return;
    })
    .catch(function (error) {
        console.log("Error sending message:", error);
    });

});
});

请参阅此处的日志。

标签: javascriptfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


通过稍微调整你的承诺链,它应该可以解决问题,见下文:

exports.getNewReport = functions.database.ref('/Hotel_Complaints/Users/{usersId}/')
    .onCreate((snapshot, context) => {
        // Grab the current value of what was written to the Realtime Database.
        var user_id = context.params.usersId;
        console.log(user_id);
        // Grab the current value of what was written to the Realtime Database.
        var eventSnapshot = snapshot.val();

        var device_token = admin.database().ref('/Hotel_Staff/' + user_id + '/device_token').once('value');

        return device_token
            .then(result => {

                var token_id = result.val();

                console.log(token_id);

                var str = eventSnapshot.issue_description;

                var payload = {
                    notification: {
                        title: "New complaint",
                        body: "New complaint for your department"
                    }
                };

                // Send a message to devices subscribed to the provided topic.
                return admin.messaging().sendToDevice(token_id, payload);
            })
            .then(response => {
                // See the MessagingTopicResponse reference documentation for the
                // contents of response.
                console.log("Successfully sent message:", response);
                return null;
            })
            .catch(error => {
                console.log("Error sending message:", error);
                return null
            });

    });

推荐阅读