【问题标题】:How to wrap Agenda in express apiRoutes in nodejs如何将议程包装在 nodejs 中的 express api Routes 中
【发布时间】:2017-05-04 20:55:44
【问题描述】:

我想使用带有 nodejs 的议程安排一个简单的任务,但是当它被包装在 apiRoutes(快速路由器)中时它没有执行

var apiRoutes = express.Router();
app.use('/api', apiRoutes);

apiRoutes.post('/scheduler/submit', function (req, res) {
    agenda.define('test', function () {
         console.log('Test');
    });

    agenda.on('ready', function () {
         agenda.every('*/1 * * * *', 'test');
         agenda.start();
    });
});

但如果我将该代码放在外面,它仍然可以工作。嗯,有什么想法吗?

var apiRoutes = express.Router();
app.use('/api', apiRoutes);

agenda.define('test', function () {
      console.log('Test');
});

agenda.on('ready', function () {
      agenda.every('*/1 * * * *', 'test');
      agenda.start();
});

apiRoutes.post('/scheduler/submit', function (req, res) {
    // Leave blank
});

【问题讨论】:

  • 您希望agenda 对象永远运行该代码还是只在发出请求时运行一次?
  • 只有 1 次发出请求。可能吗?我在请求中尝试了 console.log 议程,它正确打印议程数据库对象,但它没有执行。
  • 它应该是。我有一种预感,它涉及.on 函数,但我正在查看他们的源代码以确认。
  • 好的。一旦你得到答案,别忘了更新

标签: javascript node.js cron agenda


【解决方案1】:

问题在于on 函数。当您在 express 代码中调用 agenda.on('ready', ...) 时,您正在添加对 agenda 发射器的 ready 数组的侦听,但该信号仅在服务器初始化时 agenda 连接到您的数据库时才会出现。换句话说,当服务器启动时agenda 连接到您的数据库后,它不会再次发出相同的信号,这就是您的 express API 中的代码没有执行的原因。

要解决此问题,我建议您确认agenda 已成功连接到您的数据库并运行该过程。如果没有,则添加.on('ready', ...) 事件监听器。

示例来源:

var apiRoutes = express.Router();
app.use('/api', apiRoutes);

// Use this to determine if a conneciton has been established between agenda
// and the database
var connectionEstablised = false;

// When the connection is established, set the flag
agenda.on('ready', function() {
    connectionEstablished = true;
});

// It's better practice to have this function defined on your agenda object
// When the server initializes rather than having initializing it only if a POST
// request occurrs.
agenda.define('test', function () {
     console.log('Test');
});



apiRoutes.post('/scheduler/submit', function (req, res) {

    // Only execute this code if you can confirm the connection is established
    if (connectionEstablished) {
        agenda.every('*/1 * * * *', 'test');
        agenda.start();
    }
});

【讨论】:

  • 你是救星。
猜你喜欢
  • 2014-05-24
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2023-04-08
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
相关资源
最近更新 更多