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 出来是有效的。。

不能将一批路由写一起吗?


4 回复

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.getapp.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' });
};

解释

  1. app.useapp.get 的区别

    • app.use 通常用于中间件或全局处理函数,它会在所有路由之前执行。
    • app.getapp.post 是用来定义特定路径的路由处理函数。
  2. 使用 app.use 挂载路由中间件

    • 通过 app.use('/users', usersRouter),Express 会将 /users 路径下的请求传递给 usersRouter 处理。
  3. 模块化路由

    • 将不同的路由逻辑分离到不同的文件中,可以提高代码的可维护性和复用性。

通过这种方式,你可以确保每个路由都能正确地被匹配和处理。


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()方法来定义路由。下面是一些常见的原因和解决方案:

原因分析

  1. 顺序问题app.use()方法会根据添加的顺序进行匹配。如果一个更通用的路径(如/)先被定义,可能会阻止后续更具体的路径(如/users)被匹配。

  2. 调用方式:如果你尝试直接传递路由处理函数而不是创建路由实例并使用它,这可能不是最理想的方式。

示例代码修正

假设你的项目结构如下:

- 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()等方法定义。

通过上述修改,可以确保不同路径的路由能够正确匹配并响应。

回到顶部