Nodejs中这样设置路由为什么会无效?
Nodejs中这样设置路由为什么会无效?
Express 4.0
app.use(’/’, function(req, res) { res.render(‘index’, { title: ‘index’ }); });
app.use(’/users’,function(req, res) { res.render(‘users’,{ title:‘user’ }) });
第二个无效。。。
app.use(’/’,index); app.use(’/users’,users);
单独写在文件里 exports 出来是有效的。。
不能将一批路由写一起吗?
Node.js 中这样设置路由为什么会无效?
在 Express.js 中设置路由时,如果某些路由似乎没有生效,可能是因为你对 app.use
的使用方式有误解。app.use
主要用于全局中间件或挂载子应用,而不是直接处理特定路径的路由。
示例代码
假设你有两个路由处理函数,一个用于首页,一个用于用户页面:
// index.js
exports.index = (req, res) => {
res.render('index', { title: 'index' });
};
// users.js
exports.users = (req, res) => {
res.render('users', { title: 'users' });
};
如果你直接在主文件中使用 app.use
来调用这些函数,可能会导致问题,因为 app.use
并不会自动匹配特定的路径。正确的做法是使用 app.get
或 app.post
等方法来定义具体的路由。
正确的做法
const express = require('express');
const app = express();
// 引入路由处理函数
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
// 使用路由中间件
app.use('/', indexRouter);
app.use('/users', usersRouter);
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
然后在 routes
目录下创建两个文件:
index.js
module.exports = (req, res) => {
res.render('index', { title: 'index' });
};
users.js
module.exports = (req, res) => {
res.render('users', { title: 'users' });
};
解释
-
app.use
与app.get
的区别:app.use
通常用于中间件或全局处理函数,它会在所有路由之前执行。app.get
和app.post
是用来定义特定路径的路由处理函数。
-
使用
app.use
挂载路由中间件:- 通过
app.use('/users', usersRouter)
,Express 会将/users
路径下的请求传递给usersRouter
处理。
- 通过
-
模块化路由:
- 将不同的路由逻辑分离到不同的文件中,可以提高代码的可维护性和复用性。
通过这种方式,你可以确保每个路由都能正确地被匹配和处理。
app.use
是添加中间件(middleware)的 http://expressjs.com/4x/api.html#app.use
==> 访问 /users 时, ‘/’ 会匹配它,然后执行。
应该使用 app.all(path, [callback...], callback)
或 app.VERB(path, [callback...], callback)
, 其中VERB就是HTTP方法,比如get, post, head等。
非常非常非常非常感谢!!!
在Express.js中,使用app.use()
方法定义路由时,需要确保路径匹配逻辑正确。从你的描述来看,问题可能出在如何正确地使用app.use()
方法来定义路由。下面是一些常见的原因和解决方案:
原因分析
-
顺序问题:
app.use()
方法会根据添加的顺序进行匹配。如果一个更通用的路径(如/
)先被定义,可能会阻止后续更具体的路径(如/users
)被匹配。 -
调用方式:如果你尝试直接传递路由处理函数而不是创建路由实例并使用它,这可能不是最理想的方式。
示例代码修正
假设你的项目结构如下:
- app.js
- routes
- index.js
- users.js
app.js 文件
const express = require('express');
const app = express();
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
// 使用路由实例
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.listen(3000, () => console.log('App is listening on port 3000'));
routes/index.js 文件
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.render('index', { title: 'index' });
});
module.exports = router;
routes/users.js 文件
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.render('users', { title: 'users' });
});
module.exports = router;
关键点总结
- 使用
express.Router()
来创建独立的路由实例,并将其挂载到特定路径。 - 确保按逻辑顺序定义路由,避免更广泛的路径拦截了更具体的路径请求。
app.use()
更适合用于静态中间件或全局路由前缀,具体路由应该使用router.get()
,router.post()
等方法定义。
通过上述修改,可以确保不同路径的路由能够正确匹配并响应。