вызов сокета при возврате данных после сохранения в базе данных в ndoejs и mongoose

#javascript #node.js #promise

#javascript #node.js #обещание

Вопрос:

я хочу отправить уведомление пользователю после сохранения этого уведомления в базе данных.

во-первых: я хочу сохранить данные в базе данных :

во-вторых: я хочу вернуть пользователя FirstName adn lastName

    async CreateNotification(item): Promise<any> {
    const requestModel = new NotificationModel();
    requestModel.sender = item.sender;
    requestModel.reciver = item.reciver;
    requestModel.notificationType = item.notificationType;
    requestModel.sendDate = new Date();
  return  requestModel.save()
        .then((data) => {
            this.GetNOtificationById(data)
            .then(data=>{
              return data;
            })
        });
}

async GetNOtificationById(data) {
    let item = await NotificationModel
        .findOne({ sender: data.sender, reciver: data.reciver, notificationType: data.notificationType })
        .populate({ path: 'sender', select: "firstName lastName" }).exec();
    return item;
}
  

третье: я хочу вернуть эти данные и использовать их в сокете :

     socket.on('send Notificaiton', (data) => {
    let item;
    notificationRepository.CreateNotification(data)
        .then(data => {
            item = data;
        })
    io.sockets.in(data.reciver).emit('notification', { id: item.id, senderId: item.sender._id, notificationType: item.notificationType, senderName: item.sender.firstName   ' '   item.sender.lastName });
})
  

но у меня проблема с этим кодом, некоторое время он работает нормально, а иногда возвращает item= null на третьем шаге.

теперь, как я могу решить эту проблему???

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

1. вы можете захотеть then((data) => { return this.GetNOtificationById(data) — и в этом никогда не будет необходимости .then(data=>{ return data; }) — это в основном NOOP — он не делает асинхронные результаты доступными синхронно

2. @JaromandaX я пробовал ваш код, но он не работал

3. у вас больше проблем, чем это… приведенный ниже ответ должен заставить его работать

4. @JaromandaX это не сработало для меня, чувак

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

Ответ №1:

Проблема в том, что вы не ждете notification creation .

 // Notication
async CreateNotification(item): Promise<any> {
    try {
      const requestModel = new NotificationModel();
      requestModel.sender = item.sender;
      requestModel.reciver = item.reciver;
      requestModel.notificationType = item.notificationType;
      requestModel.sendDate = new Date();
      const data = await requestModel.save()
      const result = await this.GetNOtificationById(data)
      return result 
    } catch(err) {
      console.log(err)
      throw err
    }
}
  
 socket.on('send Notificaiton', async (data) => {
  try {
    const item = await notificationRepository.CreateNotification(data)
    if (item) {
      io.sockets.in(data.reciver).emit('notification', { id: item.id, senderId: 
      item.sender._id, notificationType: item.notificationType, senderName: 
      item.sender.firstName   ' '   item.sender.lastName });
    } else {
      console.log('Item does not exist', item)
    }
  } catch (err) {
    console.log('Error while creating item: ', err)
  }
  

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

1. Можете ли вы проверить сейчас!

2. вам нужно выяснить, почему элемент не создан,

3. в первый раз он показывает мне это null сообщение, а в другой пытается найти, что сработало.

4. Почему вы звоните GetNOtificationById после save , почему вы не можете вернуть элемент, который есть created ?

5. Пришлось бы догадаться, что requestModel.save() это не возвращает соответствующее обещание.