6

node.jsとbackbone.jsを学習し始め、TodoMVCの例を参考にしています。私は頭を包み込むのに問題があります。下記参照。TodoMVCを理解する例

ここはapp.jsです

var mongoose = require('mongoose'), 

    TodoSchema = new mongoose.Schema({ 
    title: { 'type': String, 'default': 'empty todo...' }, 
    order: { 'type': Number }, 
    done: { 'type': Boolean, 'default': false } 
    }); 

module.exports = mongoose.model('Todo', TodoSchema); 

アンディは最終的に、ここに./routesです:

var express = require('express') 
    , http = require('http') 
    , mongoose = require('mongoose') 
    , models = require('./models') 
    , routes = require('./routes') 
    , app = express(); 

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(require('stylus').middleware({ src: __dirname + '/public' })); 
    app.use(express.static(__dirname + '/public')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler()); 
}); 

routes.init(app); 


mongoose.connect("127.0.0.1", "todomvc", 27017); 

http.createServer(app).listen(3000); 

console.log("Express server listening on port 3000"); 

相続人は./modelsある

ので
(function (exports) { 

    "use strict"; 

    var mongoose = require('mongoose') 
    , crudUtils = require('../utils/crudUtils') 
    , Todo = mongoose.model('Todo'); 

    function index(req, res) { 
    res.render('index', { 'title': 'Backbone.js, Node.js, MongoDB Todos' }); 
    } 

    exports.init = function (app) { 
    app.get('/', index); 
    crudUtils.initRoutesForModel({ 'app': app, 'model': Todo }); 
    }; 

}(exports)); 

私の質問ですが、どのようにあるマングースの '藤堂' モデルこのスコープで利用可能なroutesモジュールの.model( 'Todo')?モデルモジュールがmongoose.model( 'Todo'、TodoSchema)をエクスポートしています。ルートモジュールがどのようにそのモジュールにアクセスできるかは信じていますが、理由はわかりません。私は何が欠けていますか?私は、この状況における範囲の完全な理解ではないと感じています。また、ルートを匿名で機能させる理由がわかりません。

多くの感謝!

答えて

8

これは、ノードとマングースで開始するときに対処するのがもっと混乱するものの1つです。

最初にrequire('mongoose')と入力すると、singletonのMongooseインスタンスが作成されます。後で必要なときに同じインスタンスが返されます。

これは本当に簡単に操作できますが、最初は理解しにくい「魔法」です。

これは、app.jsでmongoose.connect("127.0.0.1", "todomvc", 27017);を呼び出すと、アプリで持続する接続を作成することを意味します。

mongoose.model('Todo', TodoSchema);は、require('mongoose')を呼び出す他のスコープでTodoモデルを利用できるようにします。これはmongoose.model('Todo')です。これは、上記の例のように別のファイルrequireの先頭にvar'dするか、コールバックの途中でそれを必要とする瞬間です。

これはTodoモデルをroutes.jsに取り込む方法であり、あなたのアプリケーションについてMongooseにあなたのモデルについて確実に伝えることができます。

範囲の理解に関するご質問にお答えします。それぞれのファイルrequireは効果的に独自のスコープを持ち、プロセスのようなグローバルオブジェクト以外のものにはアクセスできません。requireには、操作したいすべての関数があり、関数を呼び出すか、exportsオブジェクトを介して公開されているクラスを作成するだけで変数を渡すことができます。

上記の実際の例では、models.jsからモデルをエクスポートするメリットはありません。これは、後でmodel.jsが必要なapp内で参照されないためです。ラップで

crudUtils.initRoutesForModel({ 'app': app, 'model': Todo }); 

(私の知る限り)何のメリットもありません:

var mongoose = require('mongoose') 
, Todo = mongoose.model('Todo'); // returns the Todo model that was registered by models.js 

藤堂は、このライン上に存在する方法は次のとおりです。それは、利用可能な藤堂モデルを作るroutes.jsに次の行をですこれは本質的にrequireによって提供されるため、匿名機能のルートになります。

+0

ありがとうございます!それは多くをクリアします。しかし、私が 'module.exports = mongoose.model( 'Todo'、TodoSchema);をコメントアウトすると、models.jsの中で、"スキーマはモデル 'Todo'に登録されていません。将来、マングースを必要とするためには、そのスキーマが利用可能である必要がありますか? –

+0

申し訳ありませんが、明確にするために、 'mongoose.model( 'Todo'、TodoSchema ')'の部分が必要です。これは、モデルをモンゴーズに登録し、それを後で利用できるようにするビットです。あなたがエクスポートしているものを使用していないので、 'module.exports ='部分をスキップすることができます。また、.jsファイルにモデルを追加してそれらをすべてエクスポートする場合は、 'exports.todoModel = ...'を使用することをお勧めします(http://stackoverflow.com/questions/5311334/what-isを参照)。モジュールからのエクスポートの詳細については、12907839#12907839の「目的のノードモジュールモジュールのエクスポートと使用方法」を参照してください。 –

+0

素晴らしい!お返事ありがとう!それは多くをクリアします。 –

0

あなたはExpressをチェックしたいと思うでしょう。

Expressは、最小限の柔軟性を備えたnode.js Webアプリケーションフレームワークであり、単一ページまたは複数ページのハイブリッドWebアプリケーションを構築するための強力な機能を提供します。

コピーものの多くと貼り付けExpressの足場を使用している - それの多くは、事前にあなたのために構築されて、あなたはここでそれを確認することができます。http://expressjs.com/

を私は右のそれのポイントは、あなたを願って方向。

関連する問題