2017-03-20 36 views
1

我得到了這個錯誤:在使用gcm推送通知時收件人鍵'registrationTokens'的Falsy值。這個錯誤是怎麼回事:Falsy值爲收件人鍵'registrationTokens'

下面你可以找到我的代碼:

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的身體( '發送通知',androidRegTokens)是:

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

有誰知道錯的是,與我碼?起初,推送通知非常完美,而不是每次我致電服務時發生此錯誤。

編輯:

我已經解決了這個感謝名單給路易斯費爾南多。的問題是該函數:

gcmPush('Notification is sent.', androidRegTokens) 

我已忘了添加標題,其是構造的一部分:

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

回答

1

的deviceTokens對象是falsy值,它可以是:null,未定義,0 ,'',NaN,錯誤。

也許它會發生,因爲您正在填充iOSReqTokens和androidRegTokens嵌套在異步操作(它似乎Device.find是異步)。所以,Device.find和for-loop的回調發生在不同的時間。可能的,for循環發生在響應之後,所以這個響應將是不確定的(而且確實是)。

因此,您需要使用一些異步控制流程庫,例如PromiseAsync,並確保操作的正確順序。

此外,您在哪裏使用推送的註冊?

+1

感謝您的回覆。我嘗試了異步控制流(異步),但發生了相同的錯誤。然後我意識到問題出在我使用推送註冊的地方。我已經用解決方案更新了我的問題。 – andzaOs