2016-06-22 122 views
1

我对node.js和MEAN堆栈非常陌生,但我试图构建一个应用程序。在这个应用程序中,数据库中会有一些默认数据。我希望这个数据人口在应用程序启动时发生。所以,它基本上会检查默认数据并在不存在的情况下创建它。在一种情况下(设置),这是存储本地设置的一个记录。在另一种情况下,它通过遍历数组向数据库添加多个默认记录。我把所有这些放在一个模块中,并在server.js中调用,但我有一种感觉,我做错了。它看起来像我开始进入回调地狱,我想知道如果我应该使用异步库或承诺或其他所有的一起。由于这些数据库调用实际上在服务器启动之前未命中,因此这可能是一个潜在的问题。Mongoose的默认数据库数据

正如我所说,我是node.js的新手,所以任何输入都会很棒。下面是模块以及在app启动时在server.js中调用的两个函数。

谢谢!

var config = require('./config'); 
var Settings = require('./app/models/settings') 
var Source = require('./app/models/source'); 

module.exports = 
    { 
     settings: function() { 
      //check to see if any records exists 
      Settings.find({}, function (err, settings) { 
       if (err) 
        return (err); 

       if (settings.length == 0) { 
        //populate default settings 
        var defaultSettings = new Settings(); 
        console.log(defaultSettings); 
        defaultSettings.save(function(err){ 
         return (err); 
        }); 
       } 
       else { 
        return settings[0]; 
       } 
      }); 
     }, 
     sources: function() { 
      Source.find({}, function (err, sources) { 
       if (sources.length == 0) { 
        defaultSources.forEach(function (item, index) { 
         s = new Source(); 
         s.domain = item.domain; 
         s.loginPage = item.loginPage; 
         s.scanUrl = item.scanUrl; 
         s.sourceType = item.sourceType; 
         s.cssSelect = item.cssSelect; 
         s.save(function (err) { 
          if (err) return err; 
         }); 
        }); 
       } 
      }); 
     } 
    } 


var defaultSources = [ 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'TV and Movies', 
     cssSelect: '.post a' 
    }, 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'TV and Movies', 
     cssSelect: '.post a' 
    }, 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'Index', 
     cssSelect: '.post a' 
    }, 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'Search', 
     cssSelect: '.post a' 
    } 
] 
+0

我不会那样做,而是创建启动配置页像site.com/config,这将是第一次运行,是鬼配置是如何起作用 –

+0

HI @ jack.the.ripper同样的想法!我其实也是先试过这个,也许我会多检查一下。谢谢! – user576838

回答

0

我想通了!这里有很多,但我基本上了解到承诺,它改变了一切!

var bodyParser = require('body-parser'); 
var Settings = require('../models/settings'); 
var Source = require('../models/source'); 

module.exports = function (app, express) { 
    var apiRouter = express.Router();  

    apiRouter.route('/settings') 
     .get(function (req, res) { 
      //check to see if any records exists 
      var settingsPromise = Settings.find({}).exec(); 
      settingsPromise.then(function (settings) { 
       if (settings.length == 0) { 
        var defaultSettings = new Settings(); 
        var newPromise = defaultSettings.save(); // might need more error handling here 
        newPromise.then(function() { res.json(defaultSettings) }) 
       } 
       else { 
        res.json(settings[0]); 
       } 
      }) 
       .catch(function (err) { 
        res.json({ success: false, message: err }) 
       }) 
     }) 
     .put(function (req, res) { 
      var id = req.body.id; 
      var promise = Settings.findOneAndUpdate({ _id: id }, req.body).exec(); 
      promise.then(function (settings) { 
       res.json({ status: true, message: 'Settings updated.' }); 
      }) 
       .catch(function (err) { 
        res.json({ success: false, message: err }); 
       }); 
     }); 

    apiRouter.route('/sources') 
     .get(function (req, res) { 
      // show all sources 
      var sourcePromise = Source.find({}); 
      sourcePromise.then(function (source) { 
       if (source.length == 0) { 
        // add default sources 
        var addActions = defaultSources.map(defaultPromises) // a handy collection of promises 
        var results = Promise.all(addActions); // wait for them all to complete here with 'Promise.all' 
        results.then(function (data) { 
         res.json(data); 
        }) 
        results.catch(function (err) { 
         res.json({ success: false, message: err }); 
        }) 
       } 
       else { 
        res.json(source); 
       } 
      }) 
       .catch(function (err) { 
        res.json({ success: false, message: err }); 
       }) 
     }) 
     .post(function (req, res) { 
      var newSource = new Source(); 
      var sourcePromise = newSource.save(); 
      sourcePromise.then(function(source){ 
       res.json({success: true, message : 'New source added.'}) 
      }) 
      .catch(function(err){ 
       res.json({ success: false, message: err }); 
      }) 

     }) 
    apiRouter.route('/sources/:source_id') 
     .get(function (req, res) { 
      // show single source 
      var sourcePromise = Source.findOne(req.params.source_id).exec(); 
      sourcePromise.then(function (source) { 
       return res.json(source); 
      }) 
       .catch(function (err) { 
        return res.json({ status: false, message: err }) 
       }) 
     }) 
     .put(function (req, res) { 
      // show single source 
      var sourcePromise = Source.findOneAndUpdate({ _id: req.params.source_id }, req.body).exec(); 
      sourcePromise.then(function (source) { 
       return res.json({ status: true, message: 'Source updated.' }); 
      }) 
       .catch(function (err) { 
        return res.json({ status: false, message: err }) 
       }) 
     }) 
     .delete(function(req, res){ 
      var sourcePromise = Source.findOneAndRemove({_id: req.params.source_id}).exec() 
      sourcePromise.then(function(source){ 
       return res.json({ status: true, message: 'Source deleted.' }); 
      }) 
       .catch(function (err) { 
        return res.json({ status: false, message: err }) 
       }) 
     }) 

    return apiRouter; 

}; 

var defaultPromises = function (item) { 
    s = new Source(); 
    s.domain = item.domain; 
    s.loginPage = item.loginPage; 
    s.scanUrl = item.scanUrl; 
    s.sourceType = item.sourceType; 
    s.cssSelect = item.cssSelect; 
    return savePromise = s.save(); 
} 

var defaultSources = [ 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'TV and Movies', 
     cssSelect: '.post a' 
    }, 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'TV and Movies', 
     cssSelect: '.post a' 
    }, 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'Index', 
     cssSelect: '.post a' 
    }, 
    { 
     domain: 'http://tehparadox.com', 
     loginPage: 'http://tehparadox.com', 
     scanUrl: 'http://tehparadox.com/forum/f63/tv-shows-2010-2011-hd-1439182/', 
     sourceType: 'Search', 
     cssSelect: '.post a' 
    } 
]