agenda

2024-08-24 • 5.0.0

Node.js 的轻量级作业调度库。

<!-- 以下是基于 Koa 的案列 -->
const Agenda = require('agenda')
const agenda = new Agenda()
const dayjs = require('dayjs')
const mongoose = require('mongoose')

// 连接到数据库
const mongoConnectionString = 'mongodb://127.0.0.1:27017/test'
agenda.database(mongoConnectionString, 'agendaJobs').processEvery('10 seconds')

agenda.on('ready', function () {
  agenda.start()
})

// 定义发送邮件任务
agenda.define('sendEmail', async job => {
  const { to, subject, info } = job.attrs.data
  try {
    // 这里自定义的发送邮件的方法
    await sendEmail({ to, subject, info })
    await job.remove()
  } catch (err) {
    job.fail(err.stack)
    await job.save()
  }
})

async function createAgenda(data) {
  /*
  可以自定义 data 数据内容,这里只做一个示例
  let { to, subject, info, time, key } = data
  time 为任务执行的时间
  */
  let { time } = data
  await agenda.schedule(dayjs(time).toDate(), 'sendEmail', data)
}

async function findAgenda({ key }) {
  const jobs = await agenda.jobs({ name: 'sendEmail', 'data.key': key }, { nextRunAt: -1 })
  return jobs
}

async function removeAgenda({ _id }) {
  const numRemoved = await agenda.cancel({ name: 'sendEmail', _id: mongoose.Types.ObjectId.createFromHexString(_id) })
  return numRemoved
}

module.exports = { createAgenda, findAgenda, removeAgenda }
npm官网查看