了解TodoMVC例(Understanding TodoMVC Example)

2019-08-01 20:32发布

开始学习的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);

安迪终于,这里是./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(“藤”)的“藤”的模式在这个范围内都有效? 我看到,该模型模块出口mongoose.model(“藤”,TodoSchema); 所以我不得不相信这是路由模块如何访问它,但我不知道为什么。 我在想什么? 我有一种感觉它真的不是一个完整的范围在这种情况下理解。 另外,我不知道有路由功能匿名的推理。

非常感谢!

Answer 1:

这是较为混乱的事情要处理的节点和猫鼬开始出来的时候有一个。

当你require('mongoose')的第一次,它创建了一个单身猫鼬的例子-同一个实例返回你需要它的每一个后续的时间。

这使得它可以很容易的工作,但它是一个有点“神奇”这就是开头难明白。

这意味着,当你调用mongoose.connect("127.0.0.1", "todomvc", 27017); 在app.js,它创建与应用程序持续的连接。

这也意味着, mongoose.model('Todo', TodoSchema); 使得任何其他范围的呼叫可用的藤堂模型require('mongoose')通过mongoose.model('Todo') 这可能会在你的另一个文件的顶部var'd require在上面的例子中,或者你需要它在回调的中间时刻。

这是你如何让藤模型到您的routes.js,和一个很好的理由,以确保告诉猫鼬你的模型是你在你的应用程序做的第一件事情之一。

要回答你关于理解范围的问题; 每次文件require有效地都有自己的范围,并没有获得任何东西,除了像处理全局对象。 你必须require你要使用一切,只能通过调用函数或创建暴露通过类传递变量在exports对象。

因此,对于实际的例子上面有出口从models.js的模式,因为它不是随后在应用程序中引用没有任何好处。在需要models.js的。 这是一个在routes.js这些线路,使提供的藤堂模型:

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

这是藤在这条线是如何存在:

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

但也没有本质上是由提供利益(据我所知)在一个匿名函数,因为这包路由require



Answer 2:

你会想看看快车。

Express是一个最小的,灵活的Node.js Web应用程序框架,构建单和多页,和混合Web应用提供一套强大的功能。

很多你复制的内容并粘贴使用快速脚手架-所以它的很多预构建适合你,你可以点击此处查看: http://expressjs.com/

我希望点你在正确的方向。



文章来源: Understanding TodoMVC Example