【问题标题】:Is it possible to share constant variable which its value receive from the Database?是否可以共享其值从数据库接收的常量变量?
【发布时间】:2021-09-02 10:02:24
【问题描述】:

我使用 Cron 模块创建了一个 cron 作业。目前,我在crawler.js 文件中声明了cron 作业,在settings.js 文件中声明了它的cron 规则,如下所示:

文件settings.js

const cronCrawlItemsRule = '0 */10 * * * *'

module.exports = { cronCrawlItemsRule  }

文件crawler.js

const connectDB = require('./config/db');
connectDB();

const { cronCrawlItemsRule } = require './settings.js';

const crawlItems = new CronJob(cronCrawlItemsRule, async function() {
  // do stuff here and save to DB that connected above.
})

问题: 我想将 cron 规则保存到 DB,然后每当我启动服务器时,获取这些 cron 规则crons 将按照 规则 运行。 请注意,这些规则将在一旦服务器启动后获得。

可以这样做吗?我试过如下:

const connectDB = require('./config/db');
connectDB();

const { cronCrawlItemsRule } = require './settings.js';

(async() => {
  const rule = (await Config.findOne({...}))?._doc.value || cronCrawlItemsRule; // <- here
  const crawlItems = new CronJob(rule, async function() { // <- and here
    // do stuff here and save to DB that connected above.
})
})()

但是当我在其他文件中需要这些规则时,我必须再次从数据库中获取这些规则。

有人知道怎么做吗?提前致谢。

【问题讨论】:

    标签: javascript node.js express cron


    【解决方案1】:

    致陷入同样问题的人。花了几天时间,我想出了解决方案。

    • settings.js 文件中,导出一个函数以从 DB 中获取设置,如下所示,这意味着您将在调用 fetchSettingFromDb 函数时导出名为 cronCrawlItemsRule 的变量:
    const setting1 = '...';
    const setting2 = '...';
    const fetchSettingFromDb = async () => {
      module.exports.cronCrawlItemsRule = (await Config.findOne({...}))?._doc.value || '0 */10 * * * *';
    }
    
    
    module.exports = { setting1, setting2, fecthSettingFromDb }
    
    • 通过在crawler.js 文件中将await 放在connectDb 函数之前,确保您的应用程序已连接到数据库。
    const connectDB = require('./config/db');
    
    // Because this "cronCrawlItemsRule" variable is not declared nor exported in settings.js file.
    // Required it like below can raise error.
    // const { cronCrawlItemsRule } = require './settings.js' // DON'T USE THIS
    const settings = require './settings.js'; //<= USE THIS
    
    // But which variable exported from the begin in settings.js file can be required as usual
    const { setting1, setting2, fetchSettingFromDb } = require('./settings');
    
    (async () => {
      await connectDB();
      
      await fecthSettingFromDb();
      // It works thanks to settings.cronCrawlItemsRule;
      const crawlItems = new CronJob(settings.cronCrawlItemsRule, async function() {
        // do stuff here and save to DB that connected above.
    })
    })()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2012-02-23
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多