【问题标题】:Returning A Value In Node.js Express Using Cron使用 Cron 在 Node.js Express 中返回一个值
【发布时间】:2018-07-28 14:55:28
【问题描述】:

我已经正确安装了 Cron 和所有内容,但在我的节点应用程序的其余部分中访问从该函数返回的值时遇到问题。

基本功能:

module.exports.myFunction = function() {
    var job = new CronJob('00 0-59 * * * *', function() {
        var a = 5;
        var b = 2;

        return a + b;

        }, function () {
        },
        true
    );
}

我认为在此处返回值,然后在我的一个路由文件中使用 promise 访问它会起作用,但它始终返回 TypeError: Cannot read property 'then' of undefined,这意味着 undefined 是从函数传递的。

这是我的路由文件中的代码:

Tester.myFunction()
        .then(function(data) {
            console.log("Done!");
            console.log(data);

            req.flash('success', "You have successfully started the software!");

            res.render('dashboard');

        })
        .catch(function(err) {
            console.log(err);
        })

由于这不起作用,我如何在使用 Cron 时正确地从函数返回值?感谢您的帮助!

【问题讨论】:

  • 你需要返回一个 Promise。
  • @Li357 我知道,我只是不知道在 Cron 函数中返回该承诺的正确方法。我尝试了 return 语句的不同定位,但它们都不起作用。
  • 你想让data成为什么?
  • 你需要更清楚你想要做什么。您是否想要在安排 cron 作业时解决承诺的行为 - 这没问题。或者您是否想要 cron 作业运行时的 then() 行为。这更有问题。您将无法从此函数返回值,因为您没有调用该函数。 cron 模块正在调用该函数。而且返回一个 Promise 是没有意义的,因为它可能会被多次调用,但 Promise 只会触发一次。
  • @Li357 我希望data 为7,返回值为a + b

标签: node.js express cron return cron-task


【解决方案1】:

您需要从myFunction 返回一个Promise,它使用您当前返回的数据进行解析,如下所示:

module.exports.myFunction = function() {
    return new Promise((resolve, reject) => {
        var job = new CronJob('00 0-59 * * * *', function() {
                var a = 5;
                var b = 2;

                resolve(a + b);

            }, function() {},
            true
        );
    })
}

但是,由于一个 cron 可以运行多次,而 promise 只解析一次,所以您也可以使用 EventEmitter

如下更改您的myFunction

module.exports.myFunction = function() {
    const myFnEventEmitter = new(require('events').EventEmitter)();
    var job = new CronJob('00 0-59 * * * *', function() {
            var a = 5;
            var b = 2;

            myFnEventEmitter.emit('started', a + b)

        }, function() {},
        true
    );
    return myFnEventEmitter;
}

在你使用它的地方,做:

const myFnEventEmitter = Tester.myFunction();
myFnEventEmitter.on('started', data => {
    console.log("Done!");
    console.log(data);
    req.flash('success', "You have successfully started the software!");
    res.render('dashboard');
})

【讨论】:

  • 这行得通 - 谢谢!我只是不确定如何正确地兑现承诺。感谢帮助
  • 不过,如果我想多次运行该函数怎么办?这就是我使用 Cron 的原因。由于 promise 可以触发一次,这不会造成问题吗?
  • EventEmitter 是需要安装的节点模块吗?
猜你喜欢
  • 2015-10-27
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多