2012-06-08 142 views
3

下午好,Node.js Express與MongoDB路由

我最近開始使用Node.js + Express + 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' }); 
     } 
    }); 
}; 

路由部分是確定的,意義當我將瀏覽器指向localhost:3000時,我看到(Jade-template generated)'index'視圖。當我指向localhost:3000/documents時,路由工作正常,代碼正在嘗試爲我的'index.js'路由的'list'部分提供服務。但是,我希望,我在主應用程序創建的「文檔」貓鼬模型將「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'?

非常感謝

編輯:下面由韋斯樣的回答,我下面的代碼添加到「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); 
}) 

一切正常,當我點爲localhost: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調用大部分被緩存,因此在您的index.js文件中需要貓鼬並獲取Document的實例有一個選項。

由於您在app.js中沒有真正使用Document,因此您始終可以將db配置移動到另一個模塊,並將重要引用導出回需要它們的腳本。

+0

感謝您的回答,我編輯了以下我試過的問題,但沒有運氣...... –

+0

因此,您沒有得到'Document is not defined'錯誤了嗎?你不應該。如果頁面從未加載,則永遠不會觸及您的響應流線。乍一看,你的數據庫調用可能有問題。我從來沒有見過以這種方式使用'.all'(這是它應該做的)(http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24all)。如果您想要獲取所有文檔,只需使用['find'](http://mongoosejs.com/docs/finding-documents.html)。 –

相關問題