sails.js模型引用错误

时间:2014-12-08 08:51:54

标签: mongodb cron sails.js

我正在研究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(模型对象)'。

你的建议非常感谢我。

(抱歉我的英语不好......; _;)

2 个答案:

答案 0 :(得分:2)

Sailsjs不会加载你的模型,直到它被提升为#34;。您需要先从已定义app.js文件的目录中运行sails lift,然后才能运行此chron作业。帆加载后,所有模型都将作为全局变量公开。在帆升起后,应该从app.js调用init.js中的代码。

答案 1 :(得分:1)

这是基于有关上述主题的讨论,因此它并非完全是“ cron作业”,但可以像一个人一样执行,还可以访问Sails.js提供的所有出色功能,包括模型。

您可以使用节点计划

这就是我所做的。

  1. 安装节点计划
npm install –save node-schedule
  1. 在config / crontab.js中创建一个crontab文件

将此代码粘贴到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();
}
*/

};
  1. 打开您的config / bootstrap.js并添加此代码
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,您应该会看到一条消息,每分钟运行一次。