在nestjs中,我有一个POST api来添加一个Date对象,它是向移动应用程序发送通知的日期和时间。
所以我需要检查所有用户,所有提醒都已到达,以便我需要触发我的移动应用程序的提醒。
这是我在nestjs中的函数
import { Injectable } from '@nestjs/common'
import { UserRepository } from '../auth/repositories/user.repository'
import { User } from '@vitabotx/common/entities/auth/user.entity'
@Injectable()
export class NotificationsCronService {
constructor(private readonly userRepository: UserRepository) {}
async sleepReminderCron() {
const users: User[] =
await this.userRepository.getAllUsersForSleepReminder()
// Set up interval to check reminders continuously
const interval = setInterval(async () => {
const currentDate = new Date()
for (const user of users) {
for (const reminder of user.userReminder) {
if (currentDate >= reminder.time) {
console.log(
`User ${user.id} should receive sleep reminder.`
)
}
}
}
}, 1000)
setTimeout(
() => {
clearInterval(interval)
},
59 * 60 * 1000
)
}
}
所以我想到运行 setInterval 和 settimeout 来每秒检查是否达到时间,而不是每分钟左右查询数据库一次。
其他项目是否有任何推荐的方法来实现这种场景?
你可以考虑使用像bull这样的库来运行cron作业,当每个用户的提醒时间,它会触发回调。
管理动态 cron(或本例中的间隔)的最佳实际方法是使用
@nestjs/schedule
库,因为它集成得很好。
您可以在此处查看更多相关信息NestJS Intervals
这样你就可以实现任何 cron 逻辑(我推荐你使用 setInterval(callback, milliseconds)
方法来解决这个问题)。