node express app.use case和mongo databases

时间:2015-06-24 18:16:01

标签: express

我正在尝试使用mongodb数据库构建一个简单的快速应用程序。以下是一些我有点困惑的代码行:

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);

所以我使用monk与我在localhost:27017上运行的数据库进行通信。我得到了。

app.use在做什么?我读了这个解释:

  

当我们将Mongo和Monk添加到app.js时,我们已经定义了“db”。它的   我们的Monk连接对象。通过将此功能添加到app.use,我们就是   将该对象添加到我们的应用程序所做的每个HTTP请求(即:“req”)。   注意:这可能不是最佳性能,但同样,我们也是   在这里快点肮脏。

这是什么意思?我可以提出哪些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
        });
    });
});

所以我想当我的路由器向/ userlist发出get请求时...我可以访问请求和响应变量。那个请求变量附加了一个db?请求和响应变量是什么?

-Jeff

1 个答案:

答案 0 :(得分:2)

Express使用称为责任链的东西。基本上,进入应用程序的每个 HTTP请求都会通过注册app.useapp.get或类似内容的所有处理程序进行处理。它们按照注册顺序执行,只选择与请求URL匹配的处理程序。

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

这意味着上面的代码注册了一个处理程序:

    始终执行
  • ,每个请求 (因为没有指定URL)
  • 首先执行 (因为它先于其他任何方式注册)
  • req.db(代表HTTP请求的对象)上存储对数据库的引用
  • 调用next(),它完全按照它所说的 - 让 next 处理程序处理请求

在这种情况下,下一个处理程序将是生成响应的“真正”处理程序之一,并且由于您的数据库处理程序首先执行,req.db引用将已经可用。