gpt4 book ai didi

javascript - 了解 TodoMVC 示例

转载 作者:数据小太阳 更新时间:2023-10-29 05:13:11 24 4
gpt4 key购买 nike

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

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));

所以我的问题是,路由模块中 mongoose.model('Todo') 中的 'Todo' 模型在此范围内如何可用?我看到模型模块正在导出 mongoose.model('Todo', TodoSchema);所以我不得不相信这是路由模块访问它的方式,但我不知道为什么。我错过了什么?我有一种感觉,它只是不完全了解这种情况下的范围。另外,我不确定让路由功能匿名的原因。

非常感谢!

最佳答案

这是开始使用 Node 和 Mongoose 时要处理的比较困惑的事情之一。

当你require('mongoose')第一次,它创建了一个 singleton Mongoose 的实例 - 每次您需要它时都会返回相同的实例。

这使得它真的很容易使用,但有点“神奇”,一开始很难理解。

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

这也意味着mongoose.model('Todo', TodoSchema);使 Todo 模型在任何其他调用 require('mongoose') 的范围内可用, 通过 mongoose.model('Todo') .这可以在另一个文件的顶部进行 var'd require如上例所示,或者您在回调过程中需要它的那一刻。

这就是将 Todo 模型放入 routes.js 的方式,这是确保将模型告知 Mongoose 是您在应用程序中要做的第一件事的一个很好的理由。

回答您关于理解范围的问题;每个文件你require实际上有它自己的范围,并且除了像进程这样的全局对象之外不能访问任何东西。你必须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 提供的.

关于javascript - 了解 TodoMVC 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com