Nodejs 请教express 4中app和router的区别
Nodejs 请教express 4中app和router的区别
var app = express();
var router = express.Router();
看文档发现router可以做的事好像app都可以做,请教一下两者的区别?app.route()
返回的是不是Router的实例?
当然可以。以下是关于app
和router
在Express 4中的区别的详细解释,并附有示例代码。
Express app
和 router
的区别
在Express框架中,app
和router
都是用来定义路由的工具,但它们在使用场景和功能上有一些不同之处。
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方法的路由。
希望这些解释和示例能帮助你更好地理解app
和router
的区别。
router 就是一个 mini 的 app。router 可以更细的划分 controller
拜读了一楼推荐的文章,加上自己的理解,觉得app的作用是做一些全局的处理(比如作用全局的中间件的引入等等),而router是开发人员做业务处理的利器(比如你可以通过router去use你自己写的针对某个特定路由的中间件),这样的好处在一楼推荐的文章中写的很清楚,个人觉得他们两个之间有什么不同并不是特别重要,只要搞明白什么时候该用谁就OK了。(我是菜鸟,不喜勿喷,谢谢你。。。)
在Express 4中,app
和router
的主要区别在于它们的作用域和使用场景。
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方法的处理函数。