2015-06-24 120 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参考将已经可用。