2016-06-22 2 views
1

私はnode.jsとMEANスタックの新機能ですが、アプリケーションを構築しようとしています。このアプリケーションでは、データベースにデフォルトのデータがいくつかあります。私は、このデータ集団が、アプリケーションの起動時に発生したいと思います。したがって、基本的にデフォルトのデータをチェックし、デフォルトのデータがない場合は作成します。あるケース(設定)では、これはローカル設定が保存される1つのレコードです。それ以外の場合は、配列に移動することでデータベースにいくつかのデフォルトレコードが追加されます。私はこのすべてをモジュールに入れ、server.jsでそれを計算しますが、私はこれが間違っていると感じています。私はコールバック地獄に入るようになっているように見えます。私は、このことや約束などのために非同期ライブラリを使うべきかどうか疑問に思っています。これらのdbコールは、サーバが起動する前に実際にはヒットしないので、潜在的な問題になる可能性があります。Mongooseのデフォルトのデータベースデータ

私が言ったように、私はnode.jsを初めて使うので、どんな入力も素晴らしいでしょう。以下は、アプリケーション起動時にserver.jsで呼び出されるモジュールと2つの関数です。

感謝!

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のようなスタートアップ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' 
    } 
] 
関連する問題