And*_*ton 6 javascript model-view-controller node.js backbone.js 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");
Run Code Online (Sandbox Code Playgroud)
Heres是./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);
Run Code Online (Sandbox Code Playgroud)
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));
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,在这个范围内的路由模块中,mongoose.model('Todo')中的'Todo'模型怎么样?我看到models模块正在导出mongoose.model('Todo',TodoSchema); 所以我不得不相信路由模块可以访问它,但我不知道为什么.我错过了什么?我感觉它在这种情况下并不完全理解范围.另外,我不确定路由功能是否匿名的原因.
非常感谢!
这是在Node和Mongoose开始时要处理的更令人困惑的事情之一.
如果您require('mongoose')
是第一次,它创建了一个单身猫鼬的例子-同一个实例返回你需要它的每一个后续的时间.
这使得它非常容易使用,但它有点"神奇",一开始很难理解.
这意味着当您mongoose.connect("127.0.0.1", "todomvc", 27017);
在app.js中调用时,它会创建一个与应用程序持续存在的连接.
这也意味着mongoose.model('Todo', TodoSchema);
Todo模型可以在任何其他调用require('mongoose')
via的范围内使用mongoose.model('Todo')
.这可以在上面require
的示例中的另一个文件的顶部变量,或者在回调过程中需要它的那一刻.
这就是你将Todo模型引入routes.js的方法,并且确保告诉Mongoose有关模型的一个很好的理由是你在应用程序中做的第一件事.
回答有关理解范围的问题; 每个文件require
实际上都有自己的作用域,并且除了像process这样的全局对象之外没有任何权限.您必须使用require
您想要使用的所有内容,并且只能通过调用函数或创建通过该exports
对象公开的类来传递变量.
因此,对于上面的实际示例,从models.js导出模型没有任何好处,因为它随后在应用程序中未被引用,其中需要models.js.在routes.js中的这些行使得Todo模型可用:
var mongoose = require('mongoose')
, Todo = mongoose.model('Todo'); // returns the Todo model that was registered by models.js
Run Code Online (Sandbox Code Playgroud)
这就是Todo在这条线上的存在方式:
crudUtils.initRoutesForModel({ 'app': app, 'model': Todo });
Run Code Online (Sandbox Code Playgroud)
在匿名函数中包装路由也没有任何好处(据我所知),因为这基本上是由提供的require
.
归档时间: |
|
查看次数: |
1869 次 |
最近记录: |