正文
在上一节中,我们为应用程序设置了入口点。现在,让我们来构建我们的第一个文件路径 /users:
import { Controller, Get, Post } from '@nestjs/common';
@Controller()
export class UsersController {
@Get('users')
getAllUsers() {}
@Get('users/:id')
getUser() {}
@Post('users')
addUser() {}
}
正如你猜想的,我们刚刚创建了一个具有 3 种不同路径的路由:
GET: users
GET: users/:id
POST: users
没有必要重复 users 的每个路径了吧?
Nest 允许我们将额外的元数据传递给 @Controller() 装饰器 - 路径,这是每个路由的前缀。让我们重写我们的控制器:
@Controller('users')
export class UsersController {
@Get()
getAllUsers(req, res, next) {}
@Get('/:id')
getUser(req, res, next) {}
@Post()
addUser(req, res, next) {}
}
正如你看到的, Nest 控制器中的方法和 Express 中的简单路由具有相同的参数列表和行为。
如果你想了解更多关于 req (请求),res(响应)和 next,你可以阅读简短的路由文档。在 Nest 中,它们是等价的。
但是有一个重要的区别。 Nest 提供了一组自定义的装饰器,你可以使用它们来标记参数。
你可以这样使用它们:
@Get('/:id')
public async getUser(@Response() res, @Param('id') id) {
const user = await this.usersService.getUser(id);
res.status(HttpStatus.OK).json(user);
}
记住在文件的开头导入装饰器。
import { Response, Param } from '@nestjs/common';
UsersController 可以使用,但是我们的模块还不知道。让我们打开 ApplicationModule 并添加一些元数据。
import { Module } from '@nestjs/common';
import { UsersController } from "./users.controller";
@Module({
controllers: [ UsersController ]
})
export class ApplicationModule {}
你可以看到,我们只需要将 controller 插入 controllers 数组中,这就够了。
组件(Components)
几乎所有的东西都是组件,Service, Repository, Provider等等。并且他们可以通过构造函数注入控制器或另一组件。
在上一节中, 我们构建了一个简单的 controller,UsersController。这个 controller 可以访问我们的数据(我知道这是一个假数据,但这并不重要)。这不是一个很好的解决方案。我们的控制器只能处理 HTTP 请求,并将更复杂的任务委托给服务(services),这就是为什么我们要创建 UsersService 组件。
实际上,UsersService 应该从持久层调用适当的方法,例如, UsersRepository 组件。我们没有任何类型的数据库,所以我们再次使用假数据。
import { Component } from '@nestjs/common';
import { HttpException } from '@nestjs/core';
@Component()
export class UsersService {
private users = [
{ id: 1, name: "John Doe" },
{ id: 2, name: "Alice Caeiro" },
{ id: 3, name: "Who Knows" },
];
getAllUsers() {
return Promise.resolve(this.users);
}
getUser(id: number) {
const user = this.users.find((user) => user.id === id);