Nodejs express默认建立的app.js里,app.use('/', routes)为什么要有第一个参数/?

Nodejs express默认建立的app.js里,app.use('/', routes)为什么要有第一个参数/?

我写成app.use(routes) 能够找到./route/index里的路由来进行不同的处理 另外还有: app.use(’/users’, users); users.js: var express = require(‘express’); var router = express.Router();

/* GET users listing. */ router.get(’/’, function(req, res) { res.send(‘respond with a resource’); });

module.exports = router; 按照这种写法,如果我url是/users 是不是会在/users的基础上,把users.js里的路由的路径也添加进来啊?


8 回复

当然可以。让我们详细解释一下这个问题,并通过示例代码来说明 app.use('/', routes) 中第一个参数 / 的作用。

解释

在 Express.js 应用程序中,app.use() 方法用于挂载中间件或路由到指定的路径上。当你使用 app.use('/', routes) 时,你是在告诉 Express 将 routes 模块中的所有路由挂载到根路径(即 /)下。这意味着任何匹配根路径下的请求都会被传递给 routes 模块进行处理。

如果你直接使用 app.use(routes),而没有指定路径前缀,Express 会将 routes 模块中的所有路由视为全局中间件。这可能导致一些意外的行为,因为这些路由可能会处理本不应由它们处理的请求。

示例代码

假设我们有一个简单的 Express 应用程序,其中包含两个文件:app.jsroutes.js

app.js

const express = require('express');
const routes = require('./routes');

const app = express();

// 挂载根路径下的路由
app.use('/', routes);

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

routes.js

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

// 处理根路径的 GET 请求
router.get('/', (req, res) => {
    res.send('Welcome to the home page!');
});

// 处理 /about 路径的 GET 请求
router.get('/about', (req, res) => {
    res.send('This is the about page.');
});

module.exports = router;

运行和测试

  1. 启动服务器:node app.js
  2. 打开浏览器,访问 http://localhost:3000/,你会看到 “Welcome to the home page!”。
  3. 访问 http://localhost:3000/about,你会看到 “This is the about page.”。

关于 /users 的问题

对于你的第二个问题,app.use('/users', users); 表示将 users 模块中的路由挂载到 /users 路径下。因此,如果你的 users.js 文件中有如下的定义:

/* GET users listing. */
router.get('/', function(req, res) {
    res.send('respond with a resource');
});

访问 http://localhost:3000/users 会触发 users.js 中的 / 路由,返回 “respond with a resource”。

但是,如果你的 users.js 文件中有如下的定义:

/* GET users listing. */
router.get('/details', function(req, res) {
    res.send('User details page.');
});

访问 http://localhost:3000/users/details 会触发 users.js 中的 /details 路由,返回 “User details page.”。

总结来说,app.use('/users', users); 并不会在 /users 路径的基础上添加额外的路径前缀,而是将 users.js 中的所有路由挂载到 /users 下。


只需要app.use(routes)就够了,会将user.js里的所有路由添加进来

我试了一下直接在.route/index里加了个app.get(’/users’) 把写在.route/users里的给覆盖掉了。。。

为什么app.use允许第一个参数是一个代表路径的字符串呢?

app.use(’/’,routes);就是把所有routes目录下的路由使用,还是只用index.js的还是什么?

我之前也纳闷过,后来去官网翻API就明白了,如果不带/,其实就是默认了是在/之下的所有路径执行 自豪地采用 CNodeJS ionic

use的意思是任意的方法,比如get post这些,都会执行。第一个参数一般是路径的,如果直接是回调,就是默认路径是根 自豪地采用 CNodeJS ionic

在Express中,app.use()方法用于定义中间件函数。当你使用 app.use('/', routes) 时,它表示将routes中间件应用于以/开头的所有路由请求。

假设你的routes文件定义了如下的路由:

// routes.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    res.send('Home Page');
});

router.get('/about', (req, res) => {
    res.send('About Page');
});

module.exports = router;

如果你在app.js中使用 app.use('/', routes),那么任何以/开头的请求都会被routes.js中的路由处理。

例如:

  • 访问http://localhost:3000/会触发routes.js中定义的/路由。
  • 访问http://localhost:3000/about也会触发routes.js中定义的/about路由。

然而,如果你使用 app.use(routes),则不会指定路径前缀,这意味着所有路由(不仅仅是以/开头的)都会被routes.js中的路由处理,这通常不是你想要的结果。

对于你提到的app.use('/users', users);,这是另一种用法。它表示将users中间件应用于以/users开头的所有路由请求。例如,访问http://localhost:3000/users将会匹配users.js文件中的/路由,而访问http://localhost:3000/users/123将会匹配users.js文件中的/:id路由(假设定义了这样的路由)。

总结一下:

  • app.use('/', routes) 将应用routes到以/开头的所有路由。
  • app.use('/users', users); 将应用users到以/users开头的所有路由。
回到顶部