我正在研究Sails.js,我有一个问题。 我使用“sails generate model site”命令创建了一个模型对象。 我在配置目录中为我的cronjob创建了init.js文件。 每次系统启动时,cronjob都从这个init.js开始。
这是init.js
var fs = require('fs'),
sails = require('sails'),
async = require('async');
exports.initSite = function () {
'use strict';
sails.log.debug('init method start!');
async.waterfall([
function (callback) {
Site.find().exec(function (err, sites) {
if (err) {
callback(err);
}
if (sites) {
async.forEachSeries(sites,
function (siteData, callback2) {
siteData.remove(function (err) {
if (err) {
callback(err);
}
callback2();
});
}, function (err) {
if (err) {
callback(err);
}
callback();
});
} else {
callback();
}
});
},
function (callback) {
var jsonData = fs.readFile('./urls.json', 'utf8', function (err, datas) {
if (err) {
callback(err);
}
callback(null, datas);
});
},
function (datas, callback) {
var urls = JSON.parse(datas);
for (var key in urls) {
var value = urls[key];
var site = new Site({
siteId: value.id,
name: value.name,
url: value.url,
category: value.category
});
site.save(function(err){
if (err) {
callback(err);
}
});
}
callback();
}
],function(err){
if (err) {
sails.log.error('ERROR!');
}
sails.log.info('INIT OK');
});
};
我从app.js这样读过这个init.js.
app.js中的
require(__dirname + '/config/init').initSite();
但每次启动应用程序时,控制台消息都会显示ReferenceError:Site is not defined。
我不知道为什么init.js无法读取'Site(模型对象)'。
你的建议非常感谢我。
(抱歉我的英语不好......; _;)
答案 0 :(得分:2)
Sailsjs不会加载你的模型,直到它被提升为#34;。您需要先从已定义app.js文件的目录中运行sails lift,然后才能运行此chron作业。帆加载后,所有模型都将作为全局变量公开。在帆升起后,应该从app.js调用init.js中的代码。
答案 1 :(得分:1)
这是基于有关上述主题的讨论,因此它并非完全是“ cron作业”,但可以像一个人一样执行,还可以访问Sails.js提供的所有出色功能,包括模型。
您可以使用节点计划。
这就是我所做的。
npm install –save node-schedule
将此代码粘贴到crontab.js中。我在这里所做的是创建一个需要cronjob的方法,最后我将该方法附加到jsonArray上,因此config / bootstrap.js将执行该文件。
module.exports.crontab = {
/*
* The asterisks in the key are equivalent to the
* schedule setting in crontab, i.e.
* minute hour day month day-of-week year
* so in the example below it will run every minute
*/
crons:function()
{
var jsonArray = [];
jsonArray.push({interval:’*/1 * * * * * ‘,method:’mytest’});
// add more cronjobs if you want like below
// but dont forget to add a new method…
//jsonArray.push({interval:’*/1 * * * * * ‘,method:’anothertest’});
return jsonArray;
},
// declare the method mytest
// and add it in the crons function
mytest: function(){
require(‘../crontab/mytest.js’).run();
}
/*
anothertest:function(){
require(‘../crontab/anothertest.js’).run();
}
*/
};
module.exports.bootstrap = function(cb) {
_.extend(sails.hooks.http.app.locals, sails.config.http.locals);
// add the lines from here
// bootstrapping all the cronjobs in the crontab folder
var schedule = require(‘node-schedule’);
sails.config.crontab.crons().forEach(function(item){
schedule.scheduleJob(item.interval,sails.config.crontab[item.method]);
});
// It’s very important to trigger this callback method when you are finished
// with the bootstrap! (otherwise your server will never lift, since it’s waiting on the bootstrap)
cb();
};
最后航行l,您应该会看到一条消息,每分钟运行一次。