Я заметил, что когда вы создаете проект с использованием Express.js, функции обработчика маршрута теперь отделены от основного файла «app.js». Теперь они помещаются в './routes/index.js'. Учитывая эту ситуацию, как теперь сохранить запись в базе данных (в этом случае используется MongoDB, доступ к которому осуществляется через Mongoose).Каков правильный способ доступа к методу сохранения модели DB из функции маршрутного обработчика?
Традиционно один имел бы функцию обработчика маршрута в «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.post('/documents.:format?', routes.add_documents);
при всей фактической обработки происходит в файле».js ./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.
};
Спасибо за ваш быстрый ответ. Имеет смысл передать модель в «Контроллер». Я немного запутался в том, как реализовать свое решение здесь. Где идет код контроллера? – Benjen
в файле контроллера. –
// маршруты module.exports = function (app, models) { var DocumentController = require ("./ controllers/documents") (приложение, модели); app.post ('/ documents: .format', DocumentController.add_documents); } –