- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想开始使用 NestJs 创建 REST API,但我不确定如何设置可扩展层通信对象。
所以从文档中了解如何 get started我想出了一个 UsersController
处理 HTTP 请求和响应,一个 UsersService
处理 Controller 和数据库访问器之间的逻辑以及UsersRepository
它负责数据库管理。
我使用 TypeORM package由 NestJs 提供,所以我的数据库模型是
@Entity('User')
export class UserEntity extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ unique: true })
username: string;
@Column()
passwordHash: string;
@Column()
passwordSalt: string;
}
GET /users/:id
的 Controller 端点和
POST /users
.
@Get(':id')
findById(@Param() findByIdParamsDTO: FindByIdParamsDTO): Promise<UserDTO> {
// find user by id and return it
}
@Post()
create(@Body() createUserBodyDTO: CreateUserBodyDTO): Promise<UserDTO> {
// create a new user and return it
}
export class IdParamsDTO {
@IsUUID()
id: string;
}
export class CreateUserBodyDTO {
@IsString()
@IsNotEmpty()
username: string;
@IsString()
@IsNotEmpty()
password: string;
}
export interface UserDTO {
id: string;
username: string;
}
public async findById(findByIdBO: FindByIdBO): Promise<UserBO> {
// ...
}
public async create(createBO: CreateBO): Promise<UserBO> {
// ...
}
export interface IdBO {
id: string;
}
export interface CreateBO {
username: string;
password: string;
}
export interface UserBO {
id: string;
username: string;
}
usermodel.save
来自存储库的功能。
export interface IdDAO {
id: string;
}
export interface CreateDAO {
username: string;
password: string;
}
最佳答案
我通过使用 class-transformer
来表示用户(内部和外部)的单个类来处理这个问题。库(由 NestJs 推荐)来处理暴露用户和内部用户之间的差异,而无需定义两个类。
这是使用您的用户模型的示例:
定义用户类
由于这个用户类被保存到数据库中,我通常为每个数据库对象期望拥有的所有字段创建一个基类。比方说:
export class BaseDBObject {
// this will expose the _id field as a string
// and will change the attribute name to `id`
@Expose({ name: 'id' })
@Transform(value => value && value.toString())
@IsOptional()
// tslint:disable-next-line: variable-name
_id: any;
@Exclude()
@IsOptional()
// tslint:disable-next-line: variable-name
_v: any;
toJSON() {
return classToPlain(this);
}
toString() {
return JSON.stringify(this.toJSON());
}
}
接下来,我们的用户将扩展这个基本类:
@Exclude()
export class User extends BaseDBObject {
@Expose()
username: string;
password: string;
constructor(partial: Partial<User> = {}) {
super();
Object.assign(this, partial);
}
}
我在这里使用了一些来自
class-transformer
的装饰器。当我们在服务器外部公开类时,库来更改这个内部用户(所有数据库字段都完好无损)。
@Expose
- 如果 class-default 是排除 @Exclude
- 如果 class-default 要公开 @Transform
- 'exporting' 时更改属性名称 classToPlain
之后函数来自
class-transformer
,我们在给定类上定义的所有规则都将被应用。
NestJs
添加装饰器以确保从 Controller 端点返回的类将使用
classToPlain
转换对象的函数,返回结果对象,省略所有私有(private)字段和转换(如将
_id
更改为
id
)
@Get(':id')
@UseInterceptors(ClassSerializerInterceptor)
async findById(@Param('id') id: string): Promise<User> {
return await this.usersService.find(id);
}
@Post()
@UseInterceptors(ClassSerializerInterceptor)
async create(@Body() createUserBody: CreateUserBodyDTO): Promise<User> {
// create a new user from the createUserDto
const userToCreate = new User(createUserBody);
return await this.usersService.create(userToCreate);
}
服务
@Injectable()
export class UsersService {
constructor(@InjectModel('User') private readonly userModel: Model<IUser>) { }
async create(createCatDto: User): Promise<User> {
const userToCreate = new User(createCatDto);
const createdUser = await this.userModel.create(userToCreate);
if (createdUser) {
return new User(createdUser.toJSON());
}
}
async findAll(): Promise<User[]> {
const allUsers = await this.userModel.find().exec();
return allUsers.map((user) => new User(user.toJSON()));
}
async find(_id: string): Promise<User> {
const foundUser = await this.userModel.findOne({ _id }).exec();
if (foundUser) {
return new User(foundUser.toJSON());
}
}
}
因为在内部我们总是使用 User 类,所以我将从数据库返回的数据转换为 User 类实例。
@nestjs/mongoose
,但基本上在从数据库中检索用户之后,
mongoose
的一切都是相同的和
TypeORM
.
@nestjs/mongoose
,我无法避免创建
IUser
传递给mongo的接口(interface)
Model
类,因为它期望扩展 mongodb
Document
的东西
export interface IUser extends mongoose.Document {
username: string;
password: string;
}
获取用户时,API 将返回转换后的 JSON:
{
"id": "5e1452f93794e82db588898e",
"username": "username"
}
Here's the code for this example in a GitHub repository .
typegoose
的示例要消除接口(interface)(基于
this blog post ),请查看
here for a model , 和
here for the base model
关于typescript - 为 NestJs REST API 创建 DTO、BO 和 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547243/
在阅读 bindonce 的文档时指令,我想知道 bo-html 之间有什么区别?和 bo-text . bo-html : evaluates "markup" and render it as h
还记得 Amiga boing 演示吗?我正在阅读 Amiga 发表 25 周年的文章,他们提到了它。勾起了一些记忆。我记得有一个 WPF(当时称为 Avalon)演示来模仿它。我做了一些谷歌搜索,发
我正在用 Java 设计一个购物车 Web 应用程序。 许多 Java 应用程序似乎都采用了我想要使用的相同命名约定。 例如: _ - 持久保存到数据库的实体 ___DAO - DAO 提供用于将 I
我想检索 Json 格式的 BI 报告内容,可以使用 Java BO sdk 吗? 如果可以的话,谁能给我一些如何检索 Json 内容的示例吗? 最佳答案 简短的回答是否定的,您无法使用 SDK 原生
我正在使用struts,现在我有一个问题:BO 类的名称是否可能与数据库中的表名不同?当我更改名称时,它会出错 最佳答案 如果您使用注释,请检查与您的对象关联的表名。 @Entity @Table(n
为栏打开设置动画... @IBOutlet var barHeight: NSLayoutConstraint! barHeight.constant = barShut?30:100
有人知道编码字符串开头的 ^Bo 是什么意思吗?字符串的其余部分是有效的 ASCII。 示例:"^BoHello" 应解释为 "Hello" 注意:'^B'为控制字符0x02 最佳答案 Ascii 0
实际上,我对这些术语以及它们之间的关系感到非常困惑。阅读有关他们每个人的一些内容,但我不了解工作流程。 DTO - 数据传输对象 - 传输值的对象 BO 业务对象 - 域模型中的对象。对象来制作业务逻
我在此代码中遇到 java.util.ConcurrentModificationException,但似乎无法理解原因或修复它。 在 BO 中我有这个(权限是 BO 内的数组列表) public v
对我来说,关于 DTO/BO 的一个问题是关于何时传递/返回 DTO 以及何时传递/返回 BO。 我的直觉 react 告诉我始终将 NHibernate 映射到 DTO,而不是 BO,并且始终传递/
我需要你的建议。我正在尝试在 ASP.NET 中开发一个将 BBL、DAL、BOboj 分开的 3 层架构。 在 DAL 内部,我通过 _view 收集数据。我想知道,我应该为每个 View 编写另一
我认为我的问题很简单,但我在这个领域并没有真正的经验。 我正在尝试使用 TOMCAT 在没有任何环境的情况下手动构建 JSP。所以我在我的页面中使用了这个结构: my-webapp |-- WEB-I
使用一组相同的业务对象通过 XML 进行序列化(通过 JAXB 与 JAX-WS 一起使用)并通过 JPA 进行持久化是一个好主意吗?将这两种“范式”合并为一类有缺点吗? 我的一门课看起来例如像这样:
我对网上找到的一个例子有点困惑 - spring & hibernate (要点 4.Model & BO & DAO)。有模型、DAO 和 BO 类(+ DAO 和 BO 接口(interface)
我需要阅读包含表格和列的 Webi 报告元数据信息。我可以读取很少的 Webi 报告元数据信息,但是对于组合和联合 Webi 报告,我无法读取任何元数据数据信息,我得到的此类报告的查询为空。 谁能告诉
所以我有一个 DAO、DTO 和 BO。下面的代码是结果: // Instantiate a new user repository. UserRepository rep = new UserRep
我开始通过 IDataErrorInfo 接口(interface)在我的 WPF 项目中实现验证。我的业务对象包含多个带有验证信息的属性。如何获取与该对象关联的所有错误消息的列表。我的想法是,这就是
我目前在我的应用程序中手动将 DTO 映射到 BO(反之亦然)。然而,这种方法笨拙且笨拙。 这两种表示之间有什么好的映射器吗? 我的要求如下: 应支持将 JPA 代理转换为标识符(DTO 不应直接链接
POJO 的定义是无规则简单的对象,在日常的代码分层中 pojo 会被分为VO、BO、 PO、 DTO VO (view object/value object)表示层对象 1、前端展示的数据,在接口
我需要一个公式在某些情况下产生一个空值,在其他情况下产生一个数字。然后我将使用数字格式来相应地呈现。像这样的东西: =If(Count([Product Id]) = 1) Then null Els
我是一名优秀的程序员,十分优秀!