Firebase 发出请求时出错:套接字挂起。错误代码:EconReset

Firebase 发出请求时出错:套接字挂起。错误代码:EconReset,firebase,econnreset,Firebase,Econnreset,我使用node.js作为后端服务器,用于从Firebase云消息服务发送推送通知。通知在本地服务器上运行正常,但在live server上,我收到以下错误: 发出请求时出错:套接字挂起。错误代码:EconReset 要考虑的是……/P> live server上的用户数以千计 Firebase版本是Firebase-admin@6.5.1 以前未注册的代币仍然存在。但现在注册的代币正在被存储 这是我发送通知的代码: for(设c=0;c{ 设平台=平台[idx]; 如果(平台==“ios”)

我使用node.js作为后端服务器,用于从Firebase云消息服务发送推送通知。通知在本地服务器上运行正常,但在live server上,我收到以下错误:

发出请求时出错:套接字挂起。错误代码:EconReset

要考虑的是……/P>
  • live server上的用户数以千计
  • Firebase版本是
    Firebase-admin@6.5.1
  • 以前未注册的代币仍然存在。但现在注册的代币正在被存储
这是我发送通知的代码:

for(设c=0;c
您的问题是由您的函数响应客户端的时间过长(超过60秒)引起的,并且是由以下行引起的:

wait admin.messaging().sendToDevice(注册令牌,有效负载)
因为您分别等待
sendToDevice()
的每次调用,所以您是以同步顺序运行for循环,而不是异步并行运行

为了避免这种情况,您需要使用数组映射和
Promise.all()
,这将允许您构建一个
sendToDevice()
请求队列。与您当前的代码一样,任何失败的消息都将被默默忽略,但我们也将对它们进行计数

您当前的代码使用了两个数组,
tokens
platforms
,因此在下面的代码中,我使用了一个回调函数,它包含两个参数—当前映射值(来自
tokens
)和它的索引(for循环的
c
值)。然后使用索引获取正确的平台条目

让fcmpromisearray=tokens.map((token,idx)=>{
设平台=平台[idx];
如果(平台==“ios”){
有效载荷={
通知:{
标题:“标题”,
副标题:“messgae”,
声音:“默认”,
徽章:“1”
},
数据:{
发送自:“,
通知类型:“”,
旗帜:“正确”
}
};
}else if(平台==“android”){
有效载荷={
数据:{
标题:“,
消息:“”,
旗帜:“正确”
}
};
}
return admin.messaging().sendToDevice(令牌,有效负载)//注意:此处“wait”更改为“return”
.然后(功能(响应){
返回true;//成功
})
.catch(函数(错误){
日志(“向发送消息时出错”,令牌);
返回false;//失败
});
});
让结果=等待承诺。全部(fcmpromisearray);//在此处等待所有sendToDevice()请求完成或失败
让成功计数=结果。减少((acc,v)=>v?acc+1:acc,0);//这条缩小的线只计算成功结果的数量
log(`successCount}/${results.length}设备成功发送消息。`);
运行此代码段后,不要忘记使用
res.send(…)
或类似方法将结果发送回客户端