开始学习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");下面是./model:
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”)在路由模块中是如何在这个作用域中使用的?我看到models模块正在导出mongoose.model('Todo',TodoSchema);所以我不得不相信这就是routes模块访问它的方式,但我不知道为什么。我遗漏了什么?我有一种感觉,在这种情况下,它只是不完全理解范围。此外,我也不确定让路由函数匿名的理由。
非常感谢!
发布于 2012-10-24 11:19:46
这是在开始使用Node和Mongoose时需要处理的比较令人困惑的事情之一。
当你第一次使用require('mongoose')时,它会创建一个Mongoose的singleton实例--每次你需要它时,都会返回相同的实例。
这使得它非常容易使用,但在一开始就很难理解它的“魔力”。
这意味着当您在app.js中调用mongoose.connect("127.0.0.1", "todomvc", 27017);时,它会创建一个持久存在于应用程序中的连接。
这也意味着mongoose.model('Todo', TodoSchema);使Todo模型在任何其他通过mongoose.model('Todo')调用require('mongoose')的作用域中都可用。这可以在你在上面的例子中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这就是Todo在这一行中的存在方式:
crudUtils.initRoutesForModel({ 'app': app, 'model': Todo });据我所知,将路由包装在匿名函数中也没有任何好处,因为这基本上是由require提供的。
发布于 2012-10-24 10:57:04
你会想看看Express。
Express是一个最小且灵活的node.js web应用程序框架,为构建单页面和多页面以及混合web应用程序提供了一组强大的功能。
你复制和粘贴的很多东西都是使用快速脚手架的--所以很多东西都是为你预先构建的,你可以在这里查看:http://expressjs.com/
我希望这给你指明了正确的方向。
https://stackoverflow.com/questions/13041777
复制相似问题