2016-06-22 127 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' 
    } 
]