我从firebase收到通知时收到此错误

时间:2018-06-03 05:04:35

标签: firebase firebase-cloud-messaging google-cloud-firestore

'use strict'
const functions = require('firebase-functions');

const admin=require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendNotification=functions.database.ref('/notifications/{user_id}/{notification_id }').onWrite((change,context) =>{

   const user_id=context.params.user_id;
   const notification_id=context.params.notification_id;

    console.log('The user ID is :',user_id);
    if(!change.after.val()){
        return console.log('A notification has been deleted from database:',notification_id);
    }

    const fromUser=admin.database().ref(`/notifications/${user_id}/${notification_id}`).once('value');

    return fromUser.then(fromUserResult=>{

        const from_user_id=fromUserResult.val().from; 
        console.log('You have new notification from:   : ', from_user_id); 


        const userQuery=admin.database().ref(`users/${from_user_id}/name`).once('value');
        return userQuery.then(userResult=>{

            const userName=userResult.val();
            const deviceToken=admin.database().ref(`/users/${user_id}/device_token`).once('value');

            return deviceToken.then(result =>{

                const token_id=result.val();

                const payload={

                    notification:{
                    title:"Friend Request",
                    body:`${userName} has sent you request`,
                    icon:"default"
                    }
                };    
                return admin.messaging().sendToDevice(token_id, payload);
            }); 
        });
    });
});
  

TypeError:无法读取null的属性'       at fromUser.then.fromUserResult(/user_code/index.js:22:47)       at process._tickDomainCallback(internal / process / next_tick.js:135:7)

2 个答案:

答案 0 :(得分:0)

您访问名为from的属性的唯一代码行位于:

const from_user_id=fromUserResult.val().from; 

因此,fromUserResult.val()必须返回null。

fromUserResultDataSnapshot类型的对象。根据{{​​3}}方法的API文档,如果查询位置没有数据,它可以返回null。因此,您必须在代码中检查该情况。

答案 1 :(得分:0)

我已经使用以下代码发送了带有发件人姓名的通知:

'use strict'

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendNotification = functions.database.ref('/Notifications/{receiver_user_id}/{notification_id}')
.onWrite((data, context) => 
{

    const receiver_user_id = context.params.receiver_user_id;
    const notification_id = context.params.notification_id;

    if(!data.after.val())
    {
        console.log('A notification has been deleted :' , notification_id);
        return null;
    }


    const sender_user_id = admin.database().ref(`/Notifications/${receiver_user_id}/${notification_id}`).once('value');

    return sender_user_id.then(fromUserResult => 
    {
        const from_sender_user_id = fromUserResult.val().from;

        const userQuery = admin.database().ref(`/Users/${from_sender_user_id}/name`).once('value');

        return userQuery.then(userResult => 
        {
            const senderUserName = userResult.val();
            console.log('You have notification from :' , senderUserName);

            const DeviceToken = admin.database().ref(`/Users/${receiver_user_id}/device_token`).once('value');
            console.log('Checkpoint2');
            return DeviceToken.then(result => 
            {
                const token_id = result.val();

                const payload = 
                {
                    notification:
                    {
                        //from_sender_user_id : from_sender_user_id,
                        title: "New Chat Request",
                        body: `${senderUserName} wants to connect with you`,
                        icon: "default"

                    }
                };

                return admin.messaging().sendToDevice(token_id, payload).then(response => 
                {

                    console.log('This was the notification Feature');
                    return null;
                 }).catch(error => {
                    console.error(error);
                    res.error(500);
                 });
            });

        });

    });
});