2012-03-07 2 views
0

Я заметил, что когда вы создаете проект с использованием 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. 
}; 

ответ

0

Я нашел способ, который появляется на работу, которая не влечет за собой огромное количество изменений в коде, изначально генерируемом Express. Все, что вам нужно сделать, это импортировать mongoose в файл, содержащий функции обработчика маршрута a.k.a., контроллеры, а затем загрузить соответствующую модель в функцию маршрутизации (см. Export.addProcess ниже).

Вот измененное содержимое»./routes/index.js'

var mongoose = require('mongoose'); 
var _ = require('underscore'); 


/* 
* GET home page. 
*/ 

exports.index = function(req, res){ 
    res.render('index', { title: 'Documents' }); 
}; 

/* 
* POST add contact page. 
*/ 
exports.addProcess = function(req, res){ 
    var Document = mongoose.model('Document'); 
    var document= new Document(); 
    document.surname = req.body.surname; 
    document.given_name = req.body.given_name; 
    document.org = req.body.org; 
    document.phone = req.body.phone; 
    document.save(function(err) { 
    res.redirect('/'); 
    }); 
}; 
0

Обычно я называю это контроллером, чтобы следовать за MVC.

Я бы импортировать мою модель/схему в контроллер

Ниже показано, как я MVC в узле/выразить

//controller 

module.exports = function (app, models) { 
    var ctrl = { 
    add_documents: function(req, res) { 
     var document = new models.Document(); 
     document.something = something; 
     document.save(); 
     res.end("Saved"); 
    } 
    return crtl; 
} 

//sample model 
module.exports = function(mongoose) { 
var Document = new mongoose.Schema({ 
    field: value 
}); 
var model = mongoose.model('Document', Document); 
return model; 
} 


//model loader 
module.exports = function(app, mongoose) { 
mongooseTypes = require("mongoose-types"); 
mongooseTypes.loadTypes(mongoose); 
var obj = { 
    Document: require('./models/document.js')(mongoose) 
} 
return obj; 
} 

//app.js 
var mongoose = require('mongoose'); 
var models = require('./models')(app, mongoose); 
var routes = require('./routes')(app, models); 

//routes 
module.exports = function(app, models) { 
    var DocumentController = require("./controllers/documents")(app, models); 
    app.post('/documents:.format', DocumentController.add_documents); 
} 
+0

Спасибо за ваш быстрый ответ. Имеет смысл передать модель в «Контроллер». Я немного запутался в том, как реализовать свое решение здесь. Где идет код контроллера? – Benjen

+0

в файле контроллера. –

+0

// маршруты module.exports = function (app, models) { var DocumentController = require ("./ controllers/documents") (приложение, модели); app.post ('/ documents: .format', DocumentController.add_documents); } –

Смежные вопросы