承诺拒绝:无法读取未定义的属性“状态”

时间:2020-09-04 09:45:33

标签: javascript node.js

我对nodejs非常陌生,对于以下代码,我遇到了上述错误。任何帮助表示赞赏。谢谢。

PushNotifications.sendMessageToAll(announcement, (err,res) => {
   if (err){
       return res.status(500).send()
     }
  res.status(200).send()
  }
  
 sendMessageToAll: function (notification, cb) {
 payload = {....}
 admin.messaging().subscribeToTopic(tokens,topic).then((res) =>{
        return admin.messaging().sendToTopic('/topics/NATA', payload)
      }).then((res) =>{
        console.log('sent', res)
        cb(undefined,res)
      }).catch((err) =>{
        console.log('Subscribed error',err)
        cb(err,undefined)
      })
    }
 }

3 个答案:

答案 0 :(得分:0)

您实际上是将undefined传递到回调cb,该回调期望第二个参数是响应对象

.catch((err) =>{
    console.log('Subscribed error',err)
    cb(err,undefined)
  })

您需要使回调程序能够处理没有res才能设置状态的情况。

答案 1 :(得分:0)

在您的诺言的catch块中,您无需输入res就调用回调:

 admin.messaging().subscribeToTopic(tokens,topic).then((res) =>{
        return admin.messaging().sendToTopic('/topics/NATA', payload)
      }).then((res) =>{
        console.log('sent', res)
        cb(undefined,res)
      }).catch((err) =>{
        console.log('Subscribed error',err)
        cb(err,undefined)  // <-- HERE the second param is res!
      })
    }
 }

编辑

res块中未定义

catch。一种方法可能是:

let outerRes;
admin.messaging().subscribeToTopic(tokens,topic).then((res) =>{
        outerRes = admin.messaging().sendToTopic('/topics/NATA', payload)
        return outerRes;
      }).then((res) =>{
        console.log('sent', res)
        cb(undefined,res)
      }).catch((err) =>{
        console.log('Subscribed error',err)
        cb(err,outerRes)  // <-- HERE the second param is res!
      })
    }
 }

答案 2 :(得分:0)

您收到的错误是因为status上不存在属性undefined,该属性正在通过以下行传回:

cb(err,undefined)

调用方需要一个response对象,因为它希望使用响应对象来设置HTTP状态代码并将响应发送回浏览器:

return res.status(500).send()

解决方案很简单:将res(“ response”的缩写)传递给错误回调,而不是undefined

  }).catch((err) =>{
    console.log('Subscribed error', err)
    cb(err, res)
  })