【问题标题】:networking error when sending push notifications to ios using google firebase cloud functions in js使用js中的google firebase cloud函数向ios发送推送通知时出现网络错误
【发布时间】:2019-11-25 23:21:00
【问题描述】:

使用 js 编写的谷歌云功能发送推送通知给我错误代码:ECONNRESET 错误。我不确定我是否正确处理了并发,但它偶尔会起作用,但大多数情况下我在返回每个并发请求时都会收到此错误。

几乎尝试了所有方法,我确实收到了有关嵌套承诺的警告,但不明白我还能怎么做。代码真的很简单。如果有哪位专家可以给我一些指点,我将永远感激不尽。

   var deviceRef = admin.firestore().collection('devices');
    var query = deviceRef.get()
        .then(snapshot => {
        snapshot.forEach(doc => {
            var FCM = doc.data().FCM
            if( FCM !== undefined ) {
                console.log(doc.id, '=>', FCM);
                admin.messaging().sendToDevice(FCM, payload);
            }
        });
        return;
        }).catch(err => {
        console.log('Error getting documents', err);
        });
        return query;

在上面的代码中,“设备”是设备唯一标识符的简单列表,并且有一个值是 FCM 令牌。该代码似乎触发了所有请求,它只是给我 ECONRESET 错误的返回值。如果我将其更改为

if(FCM === my_fcm_token) 相反,代码工作正常,因此它与发送到多个设备时的扩展有关,就好像某些事情超时或没有正确重置一样。

如果可以的话,请专家帮忙,我真的需要这个才能让我的应用程序正常运行。还有一些代码,但基本上只是设置有效负载,正如我所说的那样,它适用于一个设备,而不是多个设备。

欢迎任何建议我希望有人有一些想法。

非常感谢提前

【问题讨论】:

    标签: node.js firebase google-app-engine firebase-realtime-database


    【解决方案1】:

    看起来您的函数正在运行后台活动,这是您的函数终止后发生的任何事情。一旦函数返回或以其他方式发出完成信号,例如通过调用 Node.js 后台函数中的回调参数,函数调用就完成了。优雅终止后运行的任何代码都无法访问 CPU,也不会取得任何进展。

    此外,当在同一环境中执行后续调用时,您的后台活动会恢复,从而干扰新的调用。这可能会导致难以诊断的意外行为和错误。在函数终止后访问网络通常会导致连接被重置(ECONNRESET错误代码)。

    后台活动通常可以在单个调用的日志中检测到,方法是查找在表示调用完成的行之后记录的任何内容。后台活动有时可能会更深地隐藏在代码中,尤其是在存在异步操作(例如回调或计时器)时。检查您的代码以确保在终止函数之前完成所有异步操作。

    【讨论】:

    • 谢谢安德烈,但我仍然坚持如何改变这一点,在发送产生一个单独的过程(我认为)之前你是正确的,因为所有结果都会在稍后的某个时候返回。您是说我应该让 Node.js 为每个请求按顺序工作,即使其同步,但文档说您需要为每个“forEach”调用返回或捕获,所以我完全不知道如何做到这一点。我是否需要在此处某处进行“等待”调用,但由于我收到 ELINT 警告,因此我不确定嵌套“承诺”是否是正确的方法。任何想法我应该如何更改代码?再次感谢
    猜你喜欢
    • 2018-07-08
    • 2017-04-16
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多