首页 > 解决方案 > 在ndoejs和mongoose中保存数据库后返回数据时调用socket

问题描述

我想在将该通知保存到数据库后向用户发送通知。

首先:我想将数据保存在数据库中:

第二:我想返回用户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 });
})

但我对这段代码有疑问,有时它工作正常,有时它在第三null步中返回 item= 。

现在我该如何解决这个问题???

标签: javascriptnode.jspromise

解决方案


问题是,你不是在等待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)
  }

推荐阅读