Как правильно получить доступ к методу сохранения модели БД из функции обработчика маршрута? - PullRequest
0 голосов
/ 07 марта 2012

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

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Я нашел способ, который, кажется, работает, который не включает в себя огромное количество изменений в коде, первоначально сгенерированном Express.Все, что вам нужно сделать, это импортировать mongoose в файл, содержащий функции-обработчики маршрутов, называемые контроллерами, а затем загрузить соответствующую модель в функцию маршрутизации (см. 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 голосов
/ 07 марта 2012

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

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

Ниже описан порядок работы MVC в узле / экспрессе

* 1006.*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...