了解TodoMVC示例

开始学习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('Todo')中的'Todo'模型如何可用? 我看到模型模块正在导出mongoose.model('Todo',TodoSchema); 所以我必须相信这是路由模块如何访问它,但我不知道为什么。 我错过了什么? 我有一种感觉,就是在这种情况下对这个范围的完全理解。 另外,我不确定具有匿名路由function的原因。

非常感谢!

这是在Node和Mongoose中开始处理时更容易混淆的事情之一。

当你第一次require('mongoose')的时候,它会创build一个Mongoose的单例实例 – 每当你需要它的时候,同样的实例会被返回。

这使得它很容易处理,但是一开始就很难理解。

这意味着当你调用mongoose.connect("127.0.0.1", "todomvc", 27017); 在app.js中,它会创build一个与应用程序保持一致的连接。

这也意味着mongoose.model('Todo', TodoSchema); 通过mongoose.model('Todo')使Todo模型在任何其他的调用require('mongoose')作用域中可用。 这可能会在上面的例子中require的另一个文件的顶部,或者在callback中间需要的时候。

这就是你如何将Todo模型join到你的routes.js中,并且确保告诉Mongoose关于你的模型的一个很好的理由是你在你的应用程序中首先要做的事情之一。

回答关于理解范围的问题; 您require每个文件都有自己的作用域,除了像进程这样的全局对象外,其他任何文件都无法访问。 你必须require所有你想要的东西,并且只能通过调用函数或创build通过exports对象公开的类来传递variables。

因此,对于上面的实际示例,从models.js中导出模型没有任何好处,因为它在随后的模型.js所需的应用程序中未被引用。 routes.js中的这些行使得Todo模型可用:

 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提供的。

你将要检查出快递。

Express是一个简单而灵活的node.js Web应用程序框架,为构build单页和多页以及混合Web应用程序提供了一组强大的function。

很多复制和粘贴的东西都是使用快速脚手架 – 所以很多东西都是为你准备的,你可以在这里查看: http : //expressjs.com/

我希望你指出正确的方向。