首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解TodoMVC示例

了解TodoMVC示例
EN

Stack Overflow用户
提问于 2012-10-24 09:31:53
回答 2查看 1.9K关注 0票数 6

开始学习node.js和backbone.js,并将TodoMVC示例作为我的指南。有几个部分我在思考时遇到了麻烦。见下文。

这是app.js。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
(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模块访问它的方式,但我不知道为什么。我遗漏了什么?我有一种感觉,在这种情况下,它只是不完全理解范围。此外,我也不确定让路由函数匿名的理由。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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模型可用:

代码语言:javascript
复制
var mongoose = require('mongoose')
, Todo = mongoose.model('Todo'); // returns the Todo model that was registered by models.js

这就是Todo在这一行中的存在方式:

代码语言:javascript
复制
crudUtils.initRoutesForModel({ 'app': app, 'model': Todo });

据我所知,将路由包装在匿名函数中也没有任何好处,因为这基本上是由require提供的。

票数 8
EN

Stack Overflow用户

发布于 2012-10-24 10:57:04

你会想看看Express。

Express是一个最小且灵活的node.js web应用程序框架,为构建单页面和多页面以及混合web应用程序提供了一组强大的功能。

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

我希望这给你指明了正确的方向。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13041777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档