2012-06-08 5 views
3

Добрый день,Node.js Экспресс маршрутизации с MongoDB

Я недавно начал работать с Node.js + экспресс + MongoDB. Я создал простое приложение, содержащее:

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , routes = require('./routes') 
    , mongoose = require('mongoose') 
    , models = require('./models') 
    , Document 
    , db; 

// lots of conf ... 

models.defineModels(mongoose, function() { 
    app.Document = Document = mongoose.model('Document'); 
    db = mongoose.connect(app.set('db-uri')); 
}) 

// Routes 

app.get('/', routes.home); 
app.get('/documents.:format?', routes.list); 

// classical end of app.js 

У меня также есть соответствующий файл «index.js» внутри папки «маршруты», содержащий:

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

exports.list = function(req, res){ 
    Document.find().all(function(documents) { 
     switch (req.params.format) { 
      case 'json': 
       res.send(documents.map(function(d) { 
        return d.__doc; 
       })); 
      break; 
      default: 
       res.render('index', { title: 'Indx' }); 
     } 
    }); 
}; 

Служба маршрутизации часть OK, смысл что, когда я указываю свой браузер на localhost: 3000, я вижу (сгенерированный Jade-шаблон) «индекс». Когда я указываю на localhost: 3000/documents, маршрутизация работает нормально, а код пытается обслуживать часть «списка» моего маршрута «index.js». Тем не менее, я надеялся, что модель мангуст «Документ» Я создал в основном приложение будет признана в «index.js», но это явно не так, как я получаю следующее сообщение об ошибке:

Express 
500 ReferenceError: Document is not defined 
at C:\PERSO\DEV\indxjs\routes\index.js:23:2 
at callbacks (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:272:11) 
at param (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:246:11) 
at param (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:243:11) 
at pass (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:253:5) 
at Router._dispatch (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:280:4) 
at Object.handle (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:45:10) 
at next (C:\PERSO\DEV\indxjs\node_modules\express\node_modules\connect\lib\http.js:204:15) 
at Object.methodOverride [as handle] (C:\PERSO\DEV\indxjs\node_modules\express\node_modules\connect\lib\middleware\methodOverride.js:35:5) 
at next (C:\PERSO\DEV\indxjs\node_modules\express\node_modules\connect\lib\http.js:204:15) 

Я мог бы, очевидно, определить свой маршрут изнутри «app.js» с чем-то вроде:

app.get('/documents.:format?', loadUser, function(req, res) { 
    // ... 
} 

Но кто может увидеть способ говорить с мангустом, сохраняя при этом разделение элегантного»./routes/index.js' от «app.js»?

Большое спасибо

EDIT: следующий вид ответа от Уэса, я добавил следующий код «index.js»:

var Document; 
function defineRoutes(mongoose, fn) { 
    Document = mongoose.model('Document'); 
    fn(); 
} 
exports.defineRoutes = defineRoutes; 
// then the same as in initial post 

И я прилагается определения маршрутизации внутри этой функции в «приложении .js':

routes.defineRoutes(mongoose, function() { 
    app.get('/', routes.home); 
    app.get('/documents.:format?', routes.list); 
}) 

Все нормально, когда я указываю на локальном хосте: 3000, но когда я указываю/документов, браузер поддерживает загрузку, загрузка ...

ответ

2

Благодаря Уэсу Джонсону, я нашел выход. Я слепо следил за датированным учебником, в котором использовались устаревшие методы от MongoDb. Ниже приведен фрагмент кода, я, наконец, используется для реализации функции «Список документов»:

exports.list = function(req, res){ 
    Document.find({},function(err, documents) { 
     switch (req.params.format) { 
      case 'json': 
       res.send(documents.map(function(d) { 
        return d.toObject(); 
       })); 
      break; 
      default: 
       res.render('index', { title: 'Indx' }); 
     } 
    }); 
}; 

Еще раз, спасибо Wes!

+2

Пожалуйста, подумайте об этом, отвечая, если он решит вашу проблему. – rcdmk

1

Узел модулей является автономным с точки зрения переменной области видимости. Ваш объект Document недоступен с index.js, как вы упомянули. Вам нужно передать это логике маршрутов или пройти вдоль самого мангуста.

require звонки кешируются по большей части, поэтому требуется mongoose в вашем файле index.js и получить экземпляр Document есть один вариант.

Поскольку вы не используете Document в своем app.js, вы всегда можете перенести конфигурацию db на другой модуль и экспортировать важные ссылки обратно в нужные им сценарии.

+0

Спасибо за ваш ответ, я отредактировал вопрос, следуя тому, что я пробовал, но не повезло ... –

+0

Итак, вы больше не получаете ошибку 'Document not defined'? Тебе не должно быть. Если страница никогда не загружается, вы никогда не попадаете в линии потока ответа.На первый взгляд похоже, что с вашим вызовом базы данных может быть что-то не так. Я никогда не видел '.all', используемого таким образом ... [вот что он должен делать] (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24all). Если вы хотите получить все документы, просто используйте ['find'] (http://mongoosejs.com/docs/finding-documents.html). –