【问题标题】:request.get is not working inside a callback of node-cronrequest.get 在 node-cron 的回调中不起作用
【发布时间】:2017-01-19 18:52:43
【问题描述】:

您好,我正在编写一个脚本来每秒向特定的 url 发出请求,但是一旦我在 node-cron 回调中编写代码,我就会得到 TypeError request.get is not a function。这是我的代码

    var request = require('request');
    var generalConfig = require('./config.js')

    var cron = require('node-cron');
    var async = require('async');

    var failures = {
        webEndManager: 0,
        userManager: 0
    }
    cron.schedule('* * * * * *', function () {

        async.parallel({
            webEndManager: function (callback) {
                request.get({
                    url: generalConfig.webEndManager
                },
                    function (error, response, body) {
                        if (response) {
                            failures.webEndManager = 0;
                            callback(null, 'success');
                        }
                        else {
                            failures.webEndManager = failures.webEndManager + 1;
                            if (failures.webEndManager == 1)
                                callback(null, 'fail');
                            else
                                callback(null, 'success');
                        }
                    });
                console.log("one 3000");
            },
            userManager: function (callback) {
                request.get({
                    url: generalConfig.userManager
                },
                    function (error, response, body) {
                        if (response) {
                            failures.webEndManager = 0;
                            callback(null, 'success');
                        }
                        else {
                            failures.webEndManager = failures.webEndManager + 1;
                            if (failures.webEndManager == 1)
                                callback(null, 'fail');
                            else
                                callback(null, 'success');
                        }
                    });
                console.log("one 5001");
            },
        }, function (err, results) {
            // results is now equals to: {one: 'abc\n', two: 'xyz\n'}
            console.log(results);
        });
    console.log('running a task every minute');

});

当异步代码不在 cron 回调中时,它工作正常。

【问题讨论】:

  • 尝试在 cron.schedule 中移动 var request = require('request');
  • 谢谢!!那行得通,但是为什么行得通?我的意思是请求在顶部之前是全局范围的,那么这个更改对代码有什么影响?
  • 可能与 cron 包有关?我不知道。
  • cron 包无法引用在其外部声明的全局对象,因为它旨在作为独立运行。这就是为什么您需要在 cron 中声明请求的原因。
  • 非常感谢!! @zerohero,请创建一个答案,以便我接受并关闭此问题

标签: javascript node.js cron


【解决方案1】:

cron 包不能引用在其外部声明的全局对象,因为它是作为独立运行的。这就是为什么您需要在 cron 中声明请求的原因。

所以通过移动这条线:

var request = require('request');

进入 cron.schedule,你就可以访问它了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2012-07-24
    • 2018-11-13
    相关资源
    最近更新 更多