6

node.js と backbone.js の学習を開始し、TodoMVC の例をガイドとして使用しています。頭を包むのに苦労している部分がいくつかあります。下記参照。

これが app.js です。

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 は次のとおりです。

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);

Andy 最後に、これが ./routes です:

(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));

私の質問は、ルート モジュールの mongoose.model('Todo') の 'Todo' モデルがこのスコープでどのように利用できるかということです。models モジュールが mongoose.model('Todo', TodoSchema); をエクスポートしていることがわかります。それがルートモジュールがアクセスできる方法だと信じなければなりませんが、理由はわかりません。私は何が欠けていますか?この状況でのスコープの完全な理解ではないと感じています。また、ルート機能を匿名にする理由がよくわかりません。

どうもありがとう!

4

2 に答える 2

8

これは、NodeとMongooseを使い始めるときに対処するのが難しいことの1つです。

require('mongoose')初めて使用すると、 Mongooseのシングルトンインスタンスが作成されます。それ以降、必要になるたびに同じインスタンスが返されます。

これにより、作業が非常に簡単になりますが、最初は理解しにくいちょっとした「魔法」です。

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

また、を介しmongoose.model('Todo', TodoSchema);てを呼び出す他のスコープでTodoモデルを使用できるようにすることも意味します。これは、上記の例のように別のファイルの先頭で、またはコールバックの途中で必要になったときに変数化することができます。require('mongoose')mongoose.model('Todo')require

これは、Todoモデルをroutes.jsに取り込む方法であり、Mongooseにモデルについて確実に伝える非常に良い理由は、アプリケーションで最初に行うことの1つです。

スコープの理解に関する質問に答えるため。各ファイルにはrequire事実上独自のスコープがあり、プロセスなどのグローバルオブジェクト以外にはアクセスできません。作業したいrequireすべてのものが必要であり、関数を呼び出すか、exportsオブジェクトを介して公開されるクラスを作成することによってのみ、変数を渡すことができます。

したがって、上記の実際の例では、models.jsが必要なapp。で後で参照されないため、models.jsからモデルをエクスポートしてもメリットはありません。Todoモデルを利用可能にするのはroutes.jsの次の行です。

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

これが、Todoがこの行に存在する方法です。

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

また、ルートを無名関数でラップすることには、基本的にはによって提供されるため、(私が知る限り)利点はありませんrequire

于 2012-10-24T03:19:45.650 に答える
0

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

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

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

それがあなたを正しい方向に向けてくれることを願っています。

于 2012-10-24T02:57:03.803 に答える