作者: | 来源:互联网 | 2023-09-18 22:17
您是nestjs和ts的新手,我正尝试使用nestjs进行用户注册,并且工作正常,dto看起来就像一种将数据从Web传输到nest上任何数据源的方式。
问题是我有一个具有2个字段登录名和密码的dto,而我的数据库模式具有3个登录名,密码和admin(boolean)。
如果我提出请求并验证此登录名和密码,并且它们很好,我将其保存到数据库中,直到现在都没问题。
问题是,如果我通过DTO,并且我将管理数据真实传递给数据库,那么我知道我必须负责并将其从对象中删除,但是我有点担心这是默认行为因为这很容易导致安全漏洞。
我的代码是:
let body = {
login: 'vinicius',password: 'keyboardcat',admin: 'true'
}
// DTO
class Login {
login!: string;
password!: string;
}
let data = body as Login;
console.log(JSON.stringify(data));
// => {"login":"vinicius","password":"keyboardcat","admin":"true"}
// note that the admin is on the object even so its not on DTO
// this destructuring achieves the desired behavior
const { admin,...desiredData } = body;
console.log(JSON.stringify(desiredData));
// => {"login":"vinicius","password":"keyboardcat"} // this is the desired
问题是,你们如何处理?
我的意思是,还有什么更好的方法可以做到这一点,而又不会与每个人使用的默认DTO有太大的偏差?
我认为这就像使用@IsBolean装饰器向类添加参数一样简单
@IsBoolean()
public admin!: boolean;
也许您可以看看类验证器documentation,这是NestJS用来定义DTO的库
编辑:有了您在问题中所做的更改,我现在完全理解DTO部分中的内容,您无法执行计划的工作,因为它就像DTO中操作的蓝图一样,您可以进行一些形式的更改像在操作之前解析字符串或将嵌套对象转换为特定类之类的主体中,根据要添加的复杂性,您可以有两种方法:对象解构(示例中的一种)或创建自定义管道进行了这种转换,我建议您使用解构,但我看不到任何问题。