在保存到ndoejs和mongose中的数据库后返回数据时调用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;
}

three:我想返回该数据并在套接字中使用:

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

但我对这个代码有一个问题,有时它工作得很好,有时它在步骤three中返回item=null

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

问题是,您没有在等待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)
}

最新更新