express 框架中的app.use是什么作用?

手册上写着是:

app.use([path], function)
Use the given middleware function, with optional mount path, defaulting to "/".

但是不是很理解意思。这里的function 是在什么场合调用的?

阅读 66.1k
8 个回答

就是引入一个所谓的中间件,其实就是用来再实际请求发生之前hack req和res对象来实现一些功能,比如果最简单的logger就是在res的end事件上添加监听写入一条日志记录,express使用connect提供的中间件,列表见 这里

你也可以轻易实现自己的中间件,举个例子比如你总是需要连接mysql

app.use(function(req, res, next) {
    mysql.createClient('localhost:3306', function(err, db) {
        if (err) return next(err);
        req.db = db;
        next();
    })
})

在以后的中间件里你就可以使用 req.db对象来查询数据库了。

新手上路,请多包涵

可以简单理解为过滤器

express的官方文档有这句话

Since path defaults to “/”, middleware mounted without a path will be executed for every request to the app.

// this middleware will be executed for every request to the app
app.use(function (req, res, next) {
  console.log('Time: %d', Date.now());
  next();
})

所以有时候还是得多看官方的文档。

app.use 加载用于处理http請求的middleware(中间件),当一个请求来的时候,会依次被这些 middlewares处理。

执行的顺序是你定义的顺序,比如文档上的例子:

var logger = require('morgan');

app.use(logger());
app.use(express.static(__dirname + '/public'));
app.use(function(req, res){
  res.send('Hello');
});

这个就不会记录静态文件的日志,因为looger中间件在static中间件后面。

app.use(express.static(__dirname + '/public'));
app.use(logger());
app.use(function(req, res){
  res.send('Hello');
});

尝试自己模拟写了个express的山寨框架,终于对app.use有了比较深刻的理解;Myexpress

新手上路,请多包涵

就相当于一个中间件处理器,请求来了,让那些中间件先处理一遍

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏