这个错误是什么意思:Falsy值为收件人键'registrationTokens'

我得到这个错误:使用gcm推送通知时收件人键'registrationTokens'的Falsy值。

下面你可以find我的代码:

Device.find({ user: { $in: users }}, function (err, devices) { if (err) { logger.error('500 ' + err) return res.status(500).json({ code: config.errorCode.status500.code, message: config.errorCode.status500.message }) } var androidRegTokens = [] var iOSReqTokens = [] for (var i = 0; i < devices.length; i++) { if (devices[i].platform == 'Android') { androidRegTokens.push(devices[i].deviceToken) } else { iOSReqTokens.push(devices[i].deviceToken) } } if (androidRegTokens.length > 0) { gcmPush('Notification is sent.', androidRegTokens) } if (iOSReqTokens.length > 0) { apnsPush('Notification is sent.', iOSReqTokens) } return res.json({ msg: 'Operation succeed.'}) }) 

函数gcmPush('Notification is sent。',androidRegTokens)的主体是:

 this.sender.send(message, { registrationTokens: deviceTokens }, function (err, response) { if (err) { console.error(err) }else { console.log(response) } }) 

有谁知道我的代码有什么问题? 起初推送通知的工作是完美的,每次我打电话给这个服务都会发生这个错误。

编辑:

我已经解决了这个问题的路易斯·费尔南多。 问题是这样的function:

 gcmPush('Notification is sent.', androidRegTokens) 

我忘了添加标题,这是构造函数的一部分:

 function GcmPush (title, message, deviceTokens) { this.sender = new gcm.Sender(config.gcmSender) this.sendPushNotification(title, message, deviceTokens) } 

deviceTokens对象是一个falsy值,它可以是:null,undefined,0,'',NaN,false。

也许它会发生,因为你正在填充iOSReqTokens和androidRegTokens嵌套在asynchronous操作(看来Device.find是asynchronous)。 所以,Device.find和for-loop的callback在不同的时间发生。 可能的,for循环发生在响应之后,所以这个响应将是不确定的(而且确实是这样)。

所以,您需要使用一些asynchronous控制stream程库,如Promise或Async,并确保正确的操作顺序。

另外,在哪里使用推送的注册?