在Express中路由时,应用程序和路由器级别 - 中间件之间有什么区别?

day*_*oli 28 javascript url-routing node.js express

Express文档中,它说:

应用程序级中间件绑定到express的实例,使用app.use()和app.VERB().

路由器级中间件就像应用程序级中间件一样工作,除了它们绑定到一个实例express.Router().在上面的示例中,在应用程序级别创建的中间件系统可以使用以下代码在路由器级别进行复制.

在Express生成器提供的应用程序中,我看到主要app.js有:

var routes = require('./routes/index');
app.use('/', routes);
Run Code Online (Sandbox Code Playgroud)

./routes/index.js,我看到了这个:

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

app.use传递它router.get而不是简单地使用它的目的是什么app.get?一般,有什么之间的区别app.VERB,并router.VERB在路由方面?

Pet*_*ons 23

app.use将它传递给router.get而不是简单地使用app.get的目的是什么?

这只是模块化设计.它允许将应用程序分成几个较小的松散耦合部分,并且由于它们都没有app将它们组合在一起的共享实例的任何直接知识,因此实现了模块化.

例如,您可以构建一个完整的用户帐户子系统来处理注册,登录,忘记密码等,并通过"挂载"它们在几个不同的应用程序之间共享它app.use(require("my-user-system")).

这是这背后的唯一目的.否则没有功能,技术或性能差异.

一般来说,app.VERB和router.VERB在路由方面有什么区别?

没有不同.该应用程序有自己的主/主路由器,app.VERB只相当于方便糖app.router.VERB.


Man*_*ddy 8

一个例子将有助于:

在birds.js中:

// birds.js

var express = require('express');
var router = express.Router();

// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
    console.log('Time: ', Date.now());
    next();
});
// define the home page route
router.get('/', function (req, res) {
    res.send('Birds home page');
});
Run Code Online (Sandbox Code Playgroud)

在app.js中:

// app.js

const express = require('express')
const app = express()

var birds = require('./birds');
app.use('/birds', birds);

app.listen(3000, () => console.log('app listening on port 3000!\naccess http://localhost:3000/birds/'))
Run Code Online (Sandbox Code Playgroud)

现在请求http:// localhost:3000/birds /将转到birds.js文件.

随着应用程序变得越来越大,这种模块化方法将使维护大型代码库变得容易.

资料来源:https://expressjs.com/en/guide/routing.html