Skip to main content

Timer 触发器(定时任务)

定时任务触发器用于定时执行一个函数。腾讯云 Timer 触发器目前只支持 cron 格式。

info

温馨提醒,测试函数后请及时关闭触发器自动执行,避免超额扣费。

使用方式#

import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType } from '@midwayjs/decorator';import { Context, SCF } from '@midwayjs/faas';
@Provide()export class HelloTencentService {  @Inject()  ctx: Context;
  @ServerlessTrigger(ServerlessTriggerType.TIMER, {    type: 'cron',    value: '*/60 * * * * * *', // 每 60s 触发  })  async handleTimerEvent(event: SCF.TimerEvent) {    this.ctx.logger.info(event);    return 'hello world';  }}

注意,腾讯云的定时为全 Cron,具体 Cron 格式请参考 开发文档。

常用格式:

*/5 * * * * * * 表示每5秒触发一次0 0 2 1 * * * 表示在每月的1日的凌晨2点触发0 15 10 * * MON-FRI * 表示在周一到周五每天上午10:15触发0 0 10,14,16 * * * * 表示在每天上午10点,下午2点,4点触发0 */30 9-17 * * * * 表示在每天上午9点到下午5点每半小时触发0 0 12 * * WED * 表示在每个星期三中午12点触发

执行 npm run deploy 部署即可。

Timer 配置#

属性名类型描述
typecron必填,触发类型,代表 cron 表达式。
valuestring必填,cron 表达式或者 every 值。
payloadstring可选,一个固定传递的值,很少用

示例:

cron 表达式

@ServerlessTrigger(ServerlessTriggerType.TIMER, {  type: 'cron',  value: '0 0 4 * * *', // 每天4:00触发})

事件结构#

Timer 消息返回的结构如下,在 SCF.TimerEvent 类型中有描述。

{  Message: '',  Time: new Date().toJSON(),  TriggerName: 'test',  Type: 'Timer',}

本地开发#

事件类型的函数本地无法使用 dev 开发,只能通过运行 npm run test 进行测试执行。

本地测试#

和 HTTP 测试不同,通过 createFunctionApp 创建函数 app,通过 getServerlessInstance 获取整个类的实例,从而调用到特定方法来测试。

可以通过 createTimerEvent 方法快速创建平台传入的结构。

import { createFunctionApp, close } from '@midwayjs/mock';import { Framework, Application } from '@midwayjs/serverless-app';import { HelloTencentService } from '../src/function/hello_tencent';import { createTimerEvent } from '@midwayjs/serverless-scf-trigger';import { join } from 'path';
describe('test/hello_tencent.test.ts', () => {  let app: Application;  let instance: HelloTencentService;
  beforeAll(async () => {    // create app    app = await createFunctionApp<Framework>();    instance = await app.getServerlessInstance<HelloTencentService>(HelloTencentService);  });
  afterAll(async () => {    await close(app);  });
  it('should get result from timer trigger', async () => {    expect(await instance.handleTimerEvent(createTimerEvent())).toEqual('hello world');  });});