Nodejs 请教express 4中app和router的区别

Nodejs 请教express 4中app和router的区别

var app = express();
var router = express.Router();

看文档发现router可以做的事好像app都可以做,请教一下两者的区别?app.route()返回的是不是Router的实例?

5 回复

当然可以。以下是关于approuter在Express 4中的区别的详细解释,并附有示例代码。

Express approuter 的区别

在Express框架中,approuter都是用来定义路由的工具,但它们在使用场景和功能上有一些不同之处。

app

app是一个应用级别的对象,它包含了整个应用程序的行为。你可以用它来设置中间件、定义全局路由、错误处理等。

var express = require('express');
var app = express();

// 设置中间件
app.use(express.json());

// 定义全局路由
app.get('/', function (req, res) {
    res.send('Hello World!');
});

// 监听端口
app.listen(3000, function () {
    console.log('App listening on port 3000!');
});

router

router是一个路由级别的对象,它更适用于模块化和复用。你可以将不同的路由逻辑封装到不同的router实例中,然后在应用中导入并使用这些router

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

// 定义路由
router.get('/', function (req, res) {
    res.send('This is the home page of the router.');
});

module.exports = router;

然后在主应用文件中引入并使用这个router

var express = require('express');
var app = express();
var router = require('./routes/router');

// 使用router
app.use('/', router);

// 监听端口
app.listen(3000, function () {
    console.log('App listening on port 3000!');
});

关于 app.route()

app.route() 返回的是一个 Router 的实例。这使得你可以链式地定义多个HTTP方法的路由,而不需要重复指定路径。

app.route('/users')
  .get(function (req, res) {
      res.send('Get a list of users');
  })
  .post(function (req, res) {
      res.send('Create a new user');
  });

总结

  • app 是应用级别的对象,用于设置中间件、定义全局路由等。
  • router 是路由级别的对象,更适合模块化和复用。
  • app.route() 返回一个 Router 实例,方便链式定义多个HTTP方法的路由。

希望这些解释和示例能帮助你更好地理解approuter的区别。


router 就是一个 mini 的 app。router 可以更细的划分 controller

http://lostjs.com/2014/04/24/router-in-express-4/ 有更详细的介绍

var http = require(‘http’); var server = http.createServer(); var app = server;

app = express(); 就是做了上面的事情,另外还做了一些别的事情, 比如app.stack = {}; app.stack.a = function (req, res, next) {…}; app.stack.b = function (req, res, next) {…}; … app.use = function (arg) {… 操作this.stack…} 大致这么个意思.

这也是我特别不喜欢也不用express的原因, 我觉得他的设计者在api的水平并不是很高明。 作者完全采用包装server, 然后在上边通过运行时的差异化继承(你可以google一下这个概念)来扩展server对象。 会存在潜在的node版本升级和express函数名冲突的情况。

拜读了一楼推荐的文章,加上自己的理解,觉得app的作用是做一些全局的处理(比如作用全局的中间件的引入等等),而router是开发人员做业务处理的利器(比如你可以通过router去use你自己写的针对某个特定路由的中间件),这样的好处在一楼推荐的文章中写的很清楚,个人觉得他们两个之间有什么不同并不是特别重要,只要搞明白什么时候该用谁就OK了。(我是菜鸟,不喜勿喷,谢谢你。。。)

在Express 4中,approuter的主要区别在于它们的作用域和使用场景。

app(应用级中间件)

app是Express应用的实例,用于定义全局中间件、路由、错误处理中间件等。它通常用于定义应用的核心逻辑和对外暴露的接口。

示例代码:

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

// 全局中间件
app.use((req, res, next) => {
    console.log('这是一个全局中间件');
    next();
});

// 应用级路由
app.get('/', (req, res) => {
    res.send('Hello World!');
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});

app.listen(3000, () => {
    console.log('App is running on port 3000');
});

router(路由对象)

router是一个路由对象,它提供了一种将路由逻辑组织成独立模块的方式。它用于定义局部中间件、路由等。router常用于大型应用或模块化开发中,以保持代码结构清晰。

示例代码:

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

// 局部中间件
router.use((req, res, next) => {
    console.log('这是一个局部中间件');
    next();
});

// 路由定义
router.get('/', (req, res) => {
    res.send('Hello from Router');
});

module.exports = router;

然后在主应用文件中引入并使用这个路由:

const express = require('express');
const app = express();
const router = require('./router');

app.use(router);

app.listen(3000, () => {
    console.log('App is running on port 3000');
});

app.route()Router 的关系

app.route() 返回的是一个路由对象,这个对象可以用来定义路径的HTTP方法。它本质上是一个简化的创建Router对象的方式,方便快速定义路由。

示例代码:

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

app.route('/path')
    .get((req, res) => {
        res.send('GET request to the homepage');
    })
    .post((req, res) => {
        res.send('POST request to the homepage');
    });

app.listen(3000, () => {
    console.log('App is running on port 3000');
});

在这个例子中,app.route('/path') 实际上返回了一个内部的路由对象,你可以通过它来定义多个HTTP方法的处理函数。

回到顶部