Search code examples
mongodbcronsails.js

sails.js model reference error


I am studying Sails.js and I have a question. I made a model object using "sails generate model site" command. and I made init.js file in config directory for my cronjob. everytime system launched, cronjob starts from this init.js.

this is 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');
    });
};

and I read this init.js from app.js like this.

in app.js

require(__dirname + '/config/init').initSite();

but everytime I launch application, console messages says ReferenceError: Site is not defined.

I don't know why init.js can't read 'Site (model object)'.

your advice is very thankful for me.

(sorry for my bad english.... ;_;)


Solution

  • Sailsjs does not load your models until it has been "lifted". You need to run sails lift first from within the directory that your app.js file has been defined, then you can run this chron job. After sails loads, all your models will be exposed as globals. The code in init.js should be called from app.js after sails lifts.