Отклонение обещания: не удается прочитать свойство ‘status’ неопределенного

#javascript #node.js

#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)
      })
    }
 }  

Комментарии:

1. PushNotifications.sendMessageToAll выполняет обратный вызов без res параметра

2. вы не включили сообщение об ошибке. Пожалуйста, укажите ошибку, а также весь необходимый соответствующий код.

3. Не могли бы вы улучшить форматирование своего кода и / или вставить больше из него? Трудно понять, что происходит прямо сейчас из-за прерывистого отступа и пустых строк. Спасибо

Ответ №1:

Ошибка, которую вы получаете, заключается в том, что свойство status не существует в undefined , которое передается обратно в этой строке:

 cb(err,undefined)
  

Вызывающий ожидает response объект, потому что он хочет использовать объект response для установки кода состояния HTTP и отправки ответа в браузер:

 return res.status(500).send()
  

Решение простое: передать res (сокращение от ‘response’) обратный вызов ошибки вместо undefined :

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

Комментарии:

1. теперь я получаю 2 ошибки Promise rejection res is not defined и res.status is not a function

2. Можете ли вы обновить свой исходный пост с помощью правильно отформатированного JS и полной функции / объема того, что вы создаете? res должно быть доступно в вашей цепочке обещаний, потому что оно (должно быть) в области функции

Ответ №2:

Вы буквально передаете undefined свой обратный вызов cb , который ожидает, что второй параметр будет объектом ответа

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

Вам нужно, чтобы ваш обратный вызов мог обрабатывать отсутствие res для установки статуса.

Комментарии:

1. теперь я получаю 2 ошибки Promise rejection res is not defined и res.status is not a function

Ответ №3:

В 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!
      })
    }
 }
  

Комментарии:

1. теперь я получаю 2 ошибки Promise rejection res is not defined и res.status is not a function

2. Это потому, что res не является частью ввода catch. смотрите мою правку