Skip to content

Express.use

TIP

挂载中间件方法到路径上。如果路径未指定,那么默认为"/"。

Express
app.use([path,] callback [, callback...])

一个路由将匹配任何路径如果这个路径以这个路由设置路径后紧跟着"/"。比如:app.use('/appale', ...)将匹配"/apple","/apple/images","/apple/images/news"等。

中间件中的req.originalUrl是req.baseUrl和req.path的组合,如下面的例子所示。

Express
app.use('/admin', function(req, res, next) {
  // GET 'http://www.example.com/admin/new'
  console.log(req.originalUrl); // '/admin/new'
  console.log(req.baseUrl); // '/admin'
  console.log(req.path);// '/new'
});

由于 path默认为 "/",因此对于应用程序的每个请求,都会执行没有路径挂载的中间件。

Express
app.use((req, res, next) => {
  console.log('Time: %d', Date.now())
  next()
})

中间件函数是按顺序执行的,因此中间件包含的顺序很重要。

Express
// this middleware will not allow the request to go beyond it
app.use((req, res, next) => {
  res.send('Hello World')
})

// requests will never reach this route
app.get('/', (req, res) => {
  res.send('Welcome')
})

TIP

路径可以是代表路径的一串字符,一个路径模式,一个匹配路径的正则表达式,或者他们的一组集合。

实列:

Express
//你可以局部定义和挂载一个中间件。
app.use(function (req, res, next) {
  next();
})

//一个router是有效的中间件。
var router = express.Router();
router.get('/', function (req, res, next) {
  next();
})
app.use(router);

//一个Express程序是一个有效的中间件。
var subApp = express();
subApp.get('/', function (req, res, next) {
  next();
})
app.use(subApp);

//对于一个相同的挂载路径,你可以挂载多过一个的中间件。
var r1 = express.Router();
r1.get('/', function (req, res, next) {
  next();
})

var r2 = express.Router();
r2.get('/', function (req, res, next) {
  next();
})

app.use(r1, r2);
Express
//使用一个数组Array来组织一组中间件

var r1 = express.Router();
r1.get('/', function (req, res, next) {
  next();
})

var r2 = express.Router();
r2.get('/', function (req, res, next) {
  next();
})

app.use('/', [r1, r2]);
Express
//可以组合下面的所有方法来挂载中间件

function mw1(req, res, next) { next(); }
function mw2(req, res, next) { next(); }

var r1 = express.Router();
r1.get('/', function (req, res, next) { next(); });

var r2 = express.Router();
r2.get('/', function (req, res, next) { next(); });

var subApp = express();
subApp.get('/', function (req, res, next) { next(); });

app.use(mw1, [mw2, r1, r2], subApp);

从应用程序目录中的 "public" 目录为应用程序提供静态内容:

Express
// GET /style.css etc
app.use(express.static(path.join(__dirname, 'public')))

仅当请求路径以 "/static" 为前缀时,将中间件安装在 "/static" 以提供静态内容:

Express
// GET /static/style.css etc.
app.use('/static', express.static(path.join(__dirname, 'public')))

通过在静态中间件之后加载记录器中间件来禁用静态内容请求的日志记录:

Express
app.use(express.static(path.join(__dirname, 'public')))
app.use(logger())

提供来自多个目录的静态文件,但 "./public" 优先于其他目录:

Express
app.use(express.static(path.join(__dirname, 'public')))
app.use(express.static(path.join(__dirname, 'files')))
app.use(express.static(path.join(__dirname, 'uploads')))