有没有办法创建带有延迟的异步任务,包含 Strapi 对象作为依赖项?

问题描述 投票:0回答:1

到达端点后,我想在定义的过期时间后执行服务。 这意味着我需要使用 Strapi 实例。

有没有一种方法可以像 CRON 作业一样创建,但运行一次,并且从到达代码时开始动态设置计时,并可以访问 Strapi 实例?

我正在使用 Strapi v4

我尝试在我的服务中使用

setTimeout()
,但它说
strapi is undefined

// src/api/my-api/services/my-api.js

module.exports = createCoreService(
    'api::my-api.my-api',
    ({ strapi }) => ({
...
    // This service is called by a controller
    async myService() {
        setTimeout(
            async ({ strapi }) => {
                await strapi
                    .service('api::my-api.my-api')
                    .otherService();
            },
            10000, // 10 secs for this exemple
            { strapi }
        );
    }
...
}));
node.js asynchronous timeout backend strapi
1个回答
0
投票

如果您想在 Strapi 启动后执行任务,您需要在应用程序的

bootstrap
中执行此操作。

// src/index.js

module.exports = {
   ....
   bootstrap({ strapi }) {
      setTimeout(async () => {
                await strapi
                    .service('api::my-api.my-api')
                    .otherService();
            },
            10000, // 10 secs for this exemple
        );
   },

嗨,您需要详细说明一下,刚刚在新的 Strapi 应用程序上测试了代码,一切正常,唯一更改的文件是:

src/index.js

"use strict";

module.exports = {
  /**
   * An asynchronous register function that runs before
   * your application is initialized.
   *
   * This gives you an opportunity to extend code.
   */
  register(/*{ strapi }*/) {},

  /**
   * An asynchronous bootstrap function that runs before
   * your application gets started.
   *
   * This gives you an opportunity to set up your data model,
   * run jobs, or perform some special logic.
   */
  bootstrap({ strapi }) {
    setTimeout(async () => {
      const test = await strapi.db
        .query("plugin::users-permissions.role")
        .findMany();

      console.log({ test });
    }, 10000);
  },
};

证明:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.