weixin_39781143
weixin_39781143
2021-01-09 03:18

Schedule 错误 must have schedule and task properties

  • Node Version:10.15
  • Egg Version: 2.22.2
  • Midway version 1.8.0
  • Plugin Name:
  • Plugin Version:
  • Platform: MacOS
  • Mini Showcase Repository:

按官网给到 注册定时任务例子 写了一个 Schedule:


import { provide, schedule, CommonSchedule, inject } from 'midway';
import { AGAgent } from '../../spider/agent';

()
({
    cron: '20 * * * *',
    type: 'worker',
    immediate: false,
})
export default class FetchCookieCron implements CommonSchedule {

    ('agAgent')
    agent: AGAgent;

    async exec() {
        this.agent.updateCookieAndToken();
    }
}

启动应用后,报错:


2019-07-25 10:51:28,316 ERROR 15370 nodejs.AssertionError [ERR_ASSERTION]: schedule(/Users/Thierry/Code/Frontend/argus-eyes/src/app/schedule/fetch_cookie.ts): must have schedule and task properties
    at ScheduleLoader.load (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-schedule/lib/load_schedule.js:30:9)
    at module.exports.app (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-schedule/lib/load_schedule.js:17:6)
    at Schedule.init (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-schedule/lib/schedule.js:29:27)
    at agent.beforeStart (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-schedule/agent.js:13:20)
    at Object.callFn (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-core/lib/utils/index.js:44:42)
    at process.nextTick (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-core/lib/lifecycle.js:262:13)
    at process._tickCallback (internal/process/next_tick.js:61:11)
    at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
generatedMessage: false
name: "AssertionError [ERR_ASSERTION]"
code: "ERR_ASSERTION"
actual: undefined
expected: true
operator: "=="
pid: 15370
hostname: ThierrydeMacBook-Pro.local

看了一下源码,应该是 egg-schedule 加载定时任务时,有一个 asset:

assert(schedule.schedule, schedule(${fullpath}): must have schedule and task properties);

midway 生成的 schedule 里没有 schedule 这个属性

该提问来源于开源项目:midwayjs/midway

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

16条回答

  • weixin_39710594 weixin_39710594 4月前

    嗯,确实,而且只要不放在 app 目录下就行。 看了一遍 Egg 的源码,猜测应该是 Egg-Schedule 默认会扫描 app 下的 schedule 目录里的类。 这个操作的时间比 Midway 扫描装饰器的更加提前。 加载的时候发现这个类里并没有 schedule 属性,所以导致这个 bug。

    试了下,确实不能放在app目录下,gua官方文档有些误导 image

    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    不用装饰器,而是直接声明 schedule 就没有问题:

    
    import { provide, CommonSchedule, Context, inject } from 'midway';
    import { AGAgent } from '../../spider/agent';
    
    ()
    export default class FetchCookieCron implements CommonSchedule {
    
        ('agAgent')
        agent: AGAgent;
    
        static get schedule() {
            return {
                cron: '20 * * * *',
                type: 'worker',
                immediate: false,
            };
        }
    
        // 定时执行的具体任务
        async exec(ctx: Context) {
            this.agent.updateCookieAndToken();
        }
    }
    
    
    点赞 评论 复制链接分享
  • weixin_39924486 weixin_39924486 4月前

    got

    点赞 评论 复制链接分享
  • weixin_39543758 weixin_39543758 4月前

    cron: '20 * * ', 格式是不是不对? 少了个 * 吧

    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    cron: '20 * * ', 格式是不是不对? 少了个 * 吧

    和格式没有关系,不用 cron 换成 interval 也有以上的问题

    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    再补充一下:使用自定义 schedule 属性的方式,虽然 app 启动没有问题,但执行 task 时会报另外一个错误:

    
    2019-07-25 11:25:35,816 ERROR 16782 [Job#1564025135815416261096997906] /Users/Thierry/Code/Frontend/argus-eyes/src/app/schedule/fetch_cookie.ts execute error. TypeError: s.subscribe is not a function
        at Object.task (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-schedule/lib/load_schedule.js:37:22)
        at Messenger.app.messenger.on.info (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg-schedule/app.js:46:21)
        at Messenger.emit (events.js:182:13)
        at Messenger._onMessage (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/egg/lib/core/messenger/ipc.js:116:12)
        at process.emit (events.js:187:15)
        at process.emit (/Users/Thierry/Code/Frontend/argus-eyes/node_modules/source-map-support/source-map-support.js:465:21)
        at emit (internal/child_process.js:812:12)
        at process._tickCallback (internal/process/next_tick.js:63:19)
    

    猜测是没有继承 Egg 的 Subscription 类,导致没有 subscribe 这个方法

    点赞 评论 复制链接分享
  • weixin_39543758 weixin_39543758 4月前

    我的任务跑着没什么问题呢~

     node.js
    import { provide, schedule, inject } from 'midway';
    
    ()
    ({
        cron: '5 * * * * *',
        type: 'worker',
        immediate: false,
    })
    export class HelloCron {
        ('Queue')
        Q: any;
    
        async exec(ctx?: any) {
            ctx.logger.info(process.pid, 'hello');
        }
    }
    
    
    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    你的 midway 版本是什么?

    点赞 评论 复制链接分享
  • weixin_39543758 weixin_39543758 4月前
    console
    2019-07-25 11:34:58,552 INFO 24167 [master] =================== midway start =====================
    2019-07-25 11:34:58,555 INFO 24167 [master] node version v10.13.0
    2019-07-25 11:34:58,555 INFO 24167 [master] midway version 1.10.2
    2019-07-25 11:34:58,558 INFO 24167 [master] egg version 2.23.0, egg-core version 4.17.3
    
    点赞 评论 复制链接分享
  • weixin_39543758 weixin_39543758 4月前

    这样写试试

    node.js
    export class FetchCookieCron {
    
    }
    
    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    这样写试试

    js
    export class FetchCookieCron {
    <p>}
    </p>

    试过,一样的问题

    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    另外,升级了 midway 的版本,还是不行

    
    2019-07-25 11:43:00,851 INFO 17449 [master] =================== midway start =====================
    2019-07-25 11:43:00,853 INFO 17449 [master] node version v10.15.0
    2019-07-25 11:43:00,854 INFO 17449 [master] midway version 1.10.2
    2019-07-25 11:43:00,854 INFO 17449 [master] start with options: {"framework":"/Users/Thierry/Code/Frontend/argus-eyes/node_modules/midway","baseDir":"/Users/Thierry/Code/Frontend/argus-eyes","workers":1,"plugins":null,"https":false,"typescript":true}
    2019-07-25 11:43:00,854 INFO 17449 [master] start with env: isProduction: false, EGG_SERVER_ENV: undefined, NODE_ENV: local
    2019-07-25 11:43:00,856 INFO 17449 [master] egg version 2.23.0, egg-core version 4.17.3
    
    点赞 评论 复制链接分享
  • weixin_39543758 weixin_39543758 4月前

    提供一个复现仓库看看

    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    https://github.com/thierryxing/midway-schedule-demo

    点赞 评论 复制链接分享
  • weixin_39543758 weixin_39543758 4月前

    fetch_cookie.ts文件写在src/lib/schedule目录下没问题

    点赞 评论 复制链接分享
  • weixin_39781143 weixin_39781143 4月前

    嗯,确实,而且只要不放在 app 目录下就行。 看了一遍 Egg 的源码,猜测应该是 Egg-Schedule 默认会扫描 app 下的 schedule 目录里的类。 这个操作的时间比 Midway 扫描装饰器的更加提前。 加载的时候发现这个类里并没有 schedule 属性,所以导致这个 bug。

    点赞 评论 复制链接分享

相关推荐