【问题标题】:Cloud Firebase Functions for push notification用于推送通知的 Cloud Firebase 函数
【发布时间】:2021-02-23 22:20:13
【问题描述】:

我正在尝试创建一个功能,一旦文档更改,推送通知就会发送到用户的移动设备。这是函数的代码:

 exports.userProfileChanged = functions.firestore.document('/agents/{agentId}').onWrite( (change, context) => {
    const userId = context.params.userId;

    console.log('A change has been made to user profile');

    // Get the user device token
    const getUserDeviceToken = db.document('/device/{agentId}').once('value');

    // The snapshot to the user's tokens.
    let deviceTokens;
    const results = Promise.all([getUserDeviceToken]);
    deviceTokens = results;

    if (deviceTokens == null) {
        return console.error('No device tokens found');
    }

    let title = "Changes have been made";
    let body = "changes have been made to your user profile";

    const payload = {
        notification: { title: title, body: body},
        token: snap.data().token,
        data: {click_action: 'FLUTTER_NOTIFICATION_CLICK' }
    };

    const response = admin.messaging().sendToDevice(deviceToken, payload);
    if (response.error) {
        console.error("Error sending message: ", response.error);
    } else {
        return console.log("Message sent successfully!");
    };
    
    return Promise.all(console.log('End of function'));
});

这是在 Firebase 的函数日志中发现的错误: 用户资料已更改 TypeError: db.document 不是函数

我做错了什么?

【问题讨论】:

    标签: node.js firebase google-cloud-functions


    【解决方案1】:

    您需要先初始化数据库。这样一来,Firebase 就知道您指的是哪个数据库。

    const admin = require('firebase-admin')
    admin.initializeApp()
    
    const db = admin.firestore()
    
    exports.userProfileChanged = functions.firestore.document('/agents/{agentId}').onWrite( (change, context) => {
      // rest of your code
    })
    

    现在请注意,Firebase 仅允许您为所有功能调用一次 admin.initializeApp()。因此,将该进程移至另一个文件以在您的所有函数中重用可能是值得的。

    // admin.js
    
    const admin = require('firebase-admin')
    admin.initializeApp()
    
    exports.db = admin.firestore()
    exports.admin = admin
    
    // user-profile-changed.js
    
    const { db } = require('./admin')
    
    exports.userProfileChanged = functions.firestore.document('/agents/{agentId}').onWrite( (change, context) => {
      // rest of your code
    })
    

    【讨论】:

    • 感谢您的回复。我很抱歉造成混乱,但我确实初始化了数据库。我只是没有把它放在我的帖子里。这是我收到错误消息的行: const getUserDeviceToken = db.document('/device/{agentId}').once('value');函数日志说:TypeError:db.document 不是函数。我希望这更清楚。
    • 另外,我正在寻找关于编写 js(用于函数)以及如何与 Firebase 数据库交互的好教程。我以前从未使用过 NoSql。我需要的一件事是能够访问单个数据元素,但我想了解更多。谢谢
    • 对于课程,我强烈建议您查看fireship.io。 Jeff Delany(创建者)有大量关于使用 Firebase 的非常清晰的课程。有几个是免费的,但大多数是付费的。你可以花 25 美元买到它们,对我来说,它们物有所值。不隶属于他,只是一个客户。或者,Firebase YouTube 频道有一些很棒的播放列表,涵盖了 Firebase 平台的每一个细节。
    • 我会调查的。非常感谢你
    猜你喜欢
    • 2018-07-08
    • 2020-02-08
    • 2018-06-20
    • 2017-11-16
    • 2018-03-05
    • 1970-01-01
    • 2022-12-14
    • 2017-09-12
    • 2016-09-26
    相关资源
    最近更新 更多