【发布时间】:2012-03-07 06:45:14
【问题描述】:
我注意到当使用 Express.js 创建项目时,路由处理函数现在与主“app.js”文件分离。它们现在被放置在 './routes/index.js' 中。鉴于这种情况,现在如何将记录保存到数据库(在这种情况下使用通过 Mongoose 访问的 MongoDB)。
传统上,'app.js' 中会有路由处理函数,例如:
//Create document
app.post('/documents.:format?', function(req, res) {
var d = new Document(req.body);
d.user_id = req.currentUser.id;
d.save(function() {
switch (req.params.format) {
case 'json':
var data = d.toObject();
// TODO: Backbone requires 'id', but can I alias it?
data.id = data._id;
res.send(data);
break;
default:
req.flash('info', 'Document created');
res.redirect('/documents');
}
});
});
在新的“布局”下,此类调用将更改为类似以下内容(在“app.js”文件中):
app.post('/documents.:format?', routes.add_documents);
所有实际处理都发生在文件“./route/index.js”中:
exports.add_documents = function(req, res){
// Processing goes here!
};
我的问题是如何将原始路由处理函数合并到上面这个新的 add_documents 函数中?特别是,如何访问数据库模式模型(例如,创建“文档”的新实例)以便我可以访问数据库保存方法?
“app.js”的完整内容如下:
var express = require('express')
, routes = require('./routes')
, mongoose = require('mongoose')
, models = require('./models')
, Document;
var app = module.exports = express.createServer();
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.set('db-uri', 'mongodb://localhost/namecards');
});
app.configure('production', function(){
app.use(express.errorHandler());
});
models.defineModels(mongoose, function() {
app.Document = Document = mongoose.model('Document');
db = mongoose.connect(app.set('db-uri'));
})
// Routes
app.get('/', routes.index);
app.get('/add', routes.add_form);
app.post('/add', routes.add_document);
app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
“models.js”的内容
function defineModels(mongoose, fn) {
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
/**
* Model: Document
*/
Document = new Schema({
'surname': String,
'given_name': String,
'org': String,
'phone': String
});
mongoose.model('Document', Document);
fn();
}
exports.defineModels = defineModels;
'./routes/index.js'的内容
/*
* GET home page.
*/
exports.index = function(req, res){
res.render('index', { title: 'Documents' });
};
/*
* GET add contact page.
*/
exports.add_form = function(req, res){
res.render('add', { title: 'Add Document' });
};
/*
* POST add contact page.
*/
exports.add_document = function(req, res){
// Save data to DB using mongoose.
};
【问题讨论】: