举例说明Express.Router()是什么?

409 阅读3分钟

Express Routers 是一种组织你的 Express 应用程序的方法,这样你的主要 app.js 文件就不会变得臃肿和难以推理。当你在构建一个Express应用程序或API时,你很快就会注意到路由在app.js中不断堆积。这使得文件变得相当长,难以阅读。当我们为一个应用程序添加功能时,这个文件会变得冗长而繁琐。在Express中,解决这个问题的方法是Routers。路由器就像迷你版的Express应用程序。它们提供了处理路由匹配、请求和发送响应的功能,但它们不会启动一个单独的服务器或在自己的端口上进行监听。路由器使用所有你现在熟悉的 .get(), .put(), .post(), 和 .delete()路由。


Express.Router

为了创建一个 Express Router 的实例,我们在顶级 Express 的导入上调用.Router()方法。然后,为了使用该路由器,我们使用app.use()将其挂载到某个路径,并将路由器作为第二个参数传入。现在这个路由器将被用于所有以该路径段开始的路径。要创建一个路由器来处理所有以/hello开头的请求,代码会是这样的。

const helloRouter = express.Router();
 
app.use('/hello', helloRouter);

每个文件一个路由器

一般来说,一个路由器会存在于它自己的文件中,然后它被要求放入主程序中。这有助于保持我们的代码简洁和文件简短。

为了实现helloRouter,我们将创建一个新的文件hello.js,并将所有与/hello请求相关的代码移到其中。

这个文件现在将包含所有与/hello有关的代码。要在其他文件中使用这个路由器,需要有一个module.exports,以便其他文件能够访问helloRouter。

hello.js

const express = require('express');

names = {1: 'John', 2: 'Jane', 3: 'Jack'};

helloRouter = express.Router();

// Get all names
helloRouter.get('/', (req, res) => {
    res.json(names);
    console.log(names)
});

// Get a single name
helloRouter.get('/:id', (req, res) => {
    res.json(names[req.params.id]);
    console.log(names[req.params.id])
});

// Update a single name
helloRouter.put('/:id', (req, res, next) => {
    names[req.params.id] = req.body.name;
    res.json(names[req.params.id]);
    console.log(names);
});

// Add a new name
helloRouter.post('/', (req, res) => {
    names[req.body.id] = req.body.name;
    res.json(names[req.body.id]);
    console.log(names);
});

// Delete a name
helloRouter.delete('/:id', (req, res) => {
    delete names[req.params.id];
    res.json(names);
    console.log(names);
});

module.exports = helloRouter;

然后,我们的app.js文件可以被重构以导入helloRouter。

app.js

const express = require('express');
const app = express();
app.use(express.json())
const PORT = process.env.PORT || 4001;

const helloRouter = require('./hello.js');
app.use('/hello', helloRouter);

app.listen(PORT, () => {
    console.log(`Server is listening on ${PORT}`);
});

非常有趣的是,app.js文件中的这一小段代码现在就支持一个完整的CRUD API。


测试API

我们可以在Jetbrains WebStorm IDE中使用test.http文件一次性测试所有API端点。

test.http

### get all names
GET http://localhost:4001/hello/

### update name at id 1
PUT http://localhost:4001/hello/1
Content-Type: application/json

{
  "name": "Steph"
}

### add a new name at id 4
POST http://localhost:4001/hello/
Content-Type: application/json

{
  "id": 4,
  "name": "Wilson"
}

### delete name at id 1
DELETE http://localhost:4001/hello/1

针对API运行的测试显示所有的端点都工作良好。

express.Router()是什么?

在本教程中,我们看到了如何使用Express.Router()来创建一个更加可读和简洁的代码库。编写干净和可读的代码是你可以建立的最重要的技能之一。通过使用Express Routers,你将在你的API增长时更容易添加新的功能。