Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用节点读取Firestore中创建的最新文档?_Node.js_Firebase_Flutter_Dart_Firebase Cloud Messaging - Fatal编程技术网

Node.js 如何使用节点读取Firestore中创建的最新文档?

Node.js 如何使用节点读取Firestore中创建的最新文档?,node.js,firebase,flutter,dart,firebase-cloud-messaging,Node.js,Firebase,Flutter,Dart,Firebase Cloud Messaging,我在数据库中编写了一个云函数,用于侦听集合中的文档创建 这是函数 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().functions); var newData; exports.myTrigger = functions.firestore.document('FCM/{id

我在数据库中编写了一个云函数,用于侦听集合中的文档创建

这是函数

const functions = require('firebase-functions');
const admin = require('firebase-admin');
 
admin.initializeApp(functions.config().functions);
 
var newData;
 
exports.myTrigger = functions.firestore.document('FCM/{id}').onCreate(async (snapshot, context) => {
    //
 
    if (snapshot.empty) {
        console.log('No Devices');
        return;
    }
 
    newData = 'hello';
 
    const deviceIdTokens = await admin
        .firestore()
        .collection('FCM')
        .get();
 
 var tokens = [];
 var i=0;
    for (var token of deviceIdTokens.docs) {
        tokens.push(token.data().ar1[i]);
        i++;
    }
    var payload = {
        notification: {
            title: 'push title',
            body: 'push body',
            sound: 'default',
        },
        data: {
            push_key: 'Push Key Value',
            key1: newData,
        },
    };
 
    try {
        const response = await admin.messaging().sendToDevice(tokens, payload);
        console.log('Notification sent successfully');

        
    } catch (err) {
        console.log(err);
    }
});
这个函数工作起来很奇怪

例如,它有时发送通知,有时不发送

我不知道如何解决这个问题

在我的arr1字段中,我有一个设备令牌数组,我要向其发送通知

我希望函数只向刚刚创建(在新创建的文档中)的设备(使用令牌)发送通知,然后删除文档

我认为它正在一次向所有文档发送通知

我在诺德是个新手

是否只向仅存在于一个文档(…最新创建的文档)中的设备令牌发送通知?。。我认为它正在向所有人发送通知

请帮帮我

更新:-这是我的文档结构

首先,在onCreate处理程序中,您可以通过snap对象访问新创建文档的id,您可以通过
snapshot.id
访问id,通过
snapshot.data()
访问正文

您已经获取了新创建的文档,因此无需获取整个集合。您应该替换整个部分:

const deviceIdTokens=wait admin
.firestore()
.collection(“FCM”)
.get();
var标记=[];
var i=0;
for(deviceIdTokens.docs的var标记){
tokens.push(token.data().ar1[i]);
i++;
}
为此:

const tokens=snapshot.data().ar1;
更新:要删除新文档,可以执行以下操作

wait firestore().collection(“FCM”).doc(snapshot.id).delete();

由于新文档属于
FCM
集合,而不是“helpReqs”

谢谢,它成功了!我还有一个问题,如何删除新创建的文档,我尝试了以下代码const res=wait admin.firestore.collection('helpReqs').doc(snapshot.id).delete();,但是它不起作用。在发送通知后删除文档是一种好的做法吗?我的意思是,这会增加我的账单金额吗?是的,@MadhavamShahi,你需要支付额外的文档删除费用(实际上这是一个非常小的费用),但这并不是你想删除文档时不删除文档的理由,作为一种实践,这样做是可以的。我编辑了我的答案,以显示如何删除新文档唯一的问题是,该文档是否不再有用。我建议,如果在
FCM
中创建文档的唯一目的是使用
ar1
中的令牌进行通知,则无需删除,只需继续访问新创建的文档即可。这样比较便宜嘿,谢谢你的解释,我什么都懂了,是的,接受了(…我忘了早些时候的^ ^ ^)再次谢谢你,老兄。