2015-06-24 81 views
1

我想用mongodb數據庫構建一個簡單的快速應用程序。下面是一些代碼行,我有點困惑:node express app.use case和mongo databases

var mongo = require('mongodb'); 
var monk = require('monk'); 
var db = monk('localhost:27017/nodetest1'); 


// Make our db accessible to our router 
app.use(function(req,res,next){ 
    req.db = db; 
    next(); 
}); 

app.use('/', routes); 
app.use('/users', users); 

所以我使用的和尚是在本地主機上運行我的數據庫進行通信:27017。我明白了。

app.use正在做什麼?我讀了這個解釋:

當我們將Mongo和Monk添加到app.js時,我們已經定義了「db」。這是我們的Monk連接對象的 。通過將此函數添加到app.use,我們將 添加到我們的應用程序所做的每個HTTP請求(即:「req」)中。 注意:這可能是次優的性能,但同樣,我們 這裏快速n-dirty。

這是什麼意思?我可以做些什麼http請求?

這似乎讓我做這樣的事情在一個路線文件:

router.get('/userlist', function(req, res) { 
    var db = req.db; 
    var collection = db.get('usercollection'); 
    collection.find({},{},function(e,docs){ 
     res.render('userlist', { 
      "userlist" : docs 
     }); 
    }); 
}); 

所以我想,當我的路由器發出GET請求/用戶列表...我有訪問請求和響應變量。該請求變量有一個數據庫連接到它?請求和響應變量是什麼?

-Jeff

回答

2

Express使用一種稱爲責任鏈的東西。基本上,進入應用程序的每個HTTP請求都通過所有處理程序註冊app.use,app.get或類似。它們按照它們註冊的順序執行,只有與請求URL匹配的處理程序被選中。

app.use(function(req,res,next){ 
    req.db = db; 
    next(); 
}); 

這意味着,上述碼寄存器,一個處理程序:爲每一個請求

  • 總是執行,(因爲沒有指定的URL)
  • 執行第一(因爲它在其他地方註冊)
  • req.db(代表HTTP請求的對象上)存儲對數據庫的引用
  • 電話next()這不正是它說 - 讓我們的下一個處理程序處理該請求

在這種情況下,下一個處理將是產生反應的「真實」的處理程序之一,因爲你的DB處理程序首先執行,req.db參考將已經可用。