【问题标题】:How to add node-schedule module to the expressjs app如何将节点调度模块添加到 expressjs 应用程序
【发布时间】:2016-09-04 14:25:33
【问题描述】:

我是 Nodejs 和 Expressjs 的新手。我正在考虑让脚本在后台连续运行而不会中断应用程序。有许多调度 NodeJs 模块(例如节点调度,稍后等)可用,但我不知道如何将它们包含到我的 ExpressJs 应用程序中。

除了我应该包含这个模块的地方;在应用程序级别或路由器上。

我希望环境不是问题,我在 Windows 7 32 位机器上运行这个应用程序。

我使用 Yeoman Generator 来创建 ExpressJs 应用程序。从生成器生成的文件中复制和粘贴代码。

config.js

var path = require('path'),
rootPath = path.normalize(__dirname + '/..'),
env = process.env.NODE_ENV || 'development';

var config = {
  development: {
    root: rootPath,
    app: {
      name: 'nodejswebsocketapp'
    },
    port: process.env.PORT || 3000,
  },

  test: {
    root: rootPath,
    app: {
      name: 'nodejswebsocketapp'
    },
    port: process.env.PORT || 3000,
  },

  production: {
    root: rootPath,
    app: {
      name: 'nodejswebsocketapp'
    },
    port: process.env.PORT || 3000,
  }
};

module.exports = config[env];

express.js

var express = require('express');
var glob = require('glob');

var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var compress = require('compression');
var methodOverride = require('method-override');
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type');
    next();
}

module.exports = function(app, config) {
  var env = process.env.NODE_ENV || 'development';
  app.locals.ENV = env;
  app.locals.ENV_DEVELOPMENT = env == 'development';

  app.set('views', config.root + '/app/views');
  app.set('view engine', 'jade');

  // app.use(favicon(config.root + '/public/img/favicon.ico'));
  app.use(logger('dev'));
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({
    extended: true
  }));
  app.use(cookieParser());
  app.use(compress());
  app.use(express.static(config.root + '/public'));
  app.use(methodOverride());
  app.use(allowCrossDomain);

  var controllers = glob.sync(config.root + '/app/controllers/*.js');
  controllers.forEach(function (controller) {
    require(controller)(app);
  });

  app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
  });

  if(app.get('env') === 'development'){
    app.use(function (err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: err,
        title: 'error'
      });
    });
  }

  app.use(function (err, req, res, next) {
    res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {},
        title: 'error'
      });
  });

};

app.js

var express = require('express');
var config = require('./config/config');

var app = express();
var expressWs = require('express-ws')(app);

require('./config/express')(app, config);

app.listen(config.port, function () {
  console.log('Express server listening on port ' + config.port);
});

在此之后,我创建了一个控制器文件 scheduleTaskController.js

var express = require('express'),
    router = express.Router(),
    schedule = require('node-schedule');

module.exports = function (app) {
  app.use('/', router);
  app.use('/schedule', router);
};

router.get('/schedule', function (req, res, next) {

    console.log(schedule.RecurrenceRule());

    var rule = new schedule.RecurrenceRule();
    rule.second = 30;
    schedule.scheduleJob(rule, function(){
        console.log(new Date(), 'The 30th second of the minute.');
    });

});

点击 URL '/schedule' 将一无所获。不在浏览器中,也不在我期望 console.log 结果的命令提示符中。

【问题讨论】:

  • 我发现我的代码没有任何问题。我不明白 node-schedule 模块的工作方式。 `rule.second = 30;` 表示函数将在每分钟的第 30 秒运行,而不是每 30 秒运行一次。
  • 可以取消上面代码中创建的任务router.get('/schedule', function (req, res, next) { console.log(schedule.RecurrenceRule()); var rule = new schedule.RecurrenceRule(); rule.second = 30; schedule.scheduleJob(rule, function(){ console.log(new Date(), 'The 30th second of the minute.'); }); });

标签: node.js express crontab scheduler


【解决方案1】:

我会创建一个脚本文件夹,然后从您的 server.js 文件中获取该文件。

【讨论】:

  • 我已经在做。我在我的问题中添加了代码 sn-ps。我不明白我的代码有什么问题。
猜你喜欢
  • 2015-03-27
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多