Не определено имя пользователя в облачных функциях? - PullRequest
0 голосов
/ 19 июня 2019

Я хочу отправить уведомление на определенное устройство, чтобы я написал эту функцию и ее работу правильно, но я получил неопределенное имя пользователя

Вывод журналов:

Получить это

after: { '-LhjfwZeu0Ryr6jYRq5r': { Price: '888', date: '2019-6-19', description: 'Ghh', id: 50, nameOfProblem: 'Vbh', providerName: 'Loy', providerService: 'Carpenter', statusInfo: 'Incomplete', time: '15:22', username:"devas" }}

А username есть undefined

Вот функция

exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders')
    .onWrite(async (snapshot, context) => {
        const registrationTokens = "------";
        const providerId = context.params.pid;
        const userId = context.params.uid;
        const event = context.params;
        console.log("event", event);
        console.log(`New Order from ${userId} to ${providerId}`);
        const afterData = snapshot.after.val(); // data after the write
        const username = snapshot.after.val().username;
        console.log(afterData);
        console.log(username);
        const payload = {
            notification: {
                title: 'Message received',
                body: `You received a new order from ${username} check it now! `,
                sound: "default",
                icon: "default",
            }
        };


        try {
            const response = await admin.messaging().sendToDevice(registrationTokens, payload);
            console.log('Successfully sent message:', response);
        }
        catch (error) {
            console.log('Error sending message:', error);
        }
        return null;
    });

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Похоже, что написанный вами код предназначен для запуска при добавлении нового заказа в базу данных. Но вы объявили, что он срабатывает так:

exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders')
    .onWrite(async (snapshot, context) => {

Это означает, что вместо этого код запускается всякий раз, когда что-либо пишется для пользователя под узлом orders. Чтобы сработать только тогда, когда ордер записан под этим orders узлом, определите ваш триггер как:

exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders/{orderid}')
    .onWrite(async (snapshot, context) => {

Разница выше в том, что путь теперь включает {orderid}, что означает, что он запускает на один уровень ниже в дереве, и ваш snapshot.after больше не будет содержать уровень -L.


Поскольку вам кажется, что на самом деле вас беспокоит только то, когда создается заказ, вы также можете активировать его только (это означает, что ваша функция не будет вызываться при обновлении или удалении заказа). Это было бы что-то вроде этого:

exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders/{orderid}')
.onCreate(async (snapshot, context) => {
    ...
    const afterData = snapshot.val();
    const username = snapshot.val().username;
    console.log(afterData);
    console.log(username);
    ...
});

Здесь мы снова запускаем на нижнем уровне в JSON. Но поскольку теперь мы запускаем onCreate, у нас больше нет снимка «до» и «после», а вместо этого просто делаем snapshot.val(), чтобы получить только что созданные данные.

0 голосов
/ 19 июня 2019

Поскольку у объекта, который вы извлекаете, есть сгенерированный элемент, вы можете использовать цикл for для получения значения.

const object = snapshot.after.val()
for(const key in object) {
    if (object.hasOwnProperty(key)) {
        const element = object[key];
        if(element.username) {
             console.log(element.username);
             break;
        }  
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...