Я заметил, что при создании проекта с использованием Express.js функции обработчика маршрута теперь отделены от основного файла app.js.Теперь они помещены в «./routes/index.js».Учитывая эту ситуацию, как теперь сохранить запись в базе данных (в этом случае используя MongoDB, доступ к которой осуществляется через Mongoose).
Традиционно можно было бы использовать функцию обработчика маршрута в «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, указанную выше?В частности, как можно получить доступ к модели схемы базы данных (например, создать новый экземпляр «Document»), чтобы я мог получить доступ к методу сохранения базы данных?
Полное содержимое файла 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.
};