是否可以將驗證管道用于服務功能?我想在一個在類中創建物件的函式中檢查我的資料,但它似乎沒有效果:
@UsePipes(new ValidationPipe())
async create(createMemberDto: CreateMemberDto, temp: boolean=false) {
// Do something
}
管道對控制器中的端點運行良好,但不適用于服務中的此函式(如果缺少值,則不會引發例外)。
我該如何處理,或者有什么替代方法?
uj5u.com熱心網友回復:
不,這是不可能的。這會@UsePipes()設定 Nest 稍后讀取的元資料。當 Nest 啟動時,它基本上將每個路由設定為底層 HTTP 配接器的中間件。在這個中間件中,Nest 檢查所有可能的元資料(方法型別、路由名稱、使用管道、使用守衛、使用攔截器和使用過濾器),然后是路由處理程式引數(req、body、param、query 等)的元資料) 并且基本上做這樣的事情(大量的偽代碼進來,實際代碼更清晰,寫得更好)
const foundClasses = await this.discoveryService.findClassesWithMetadata(ControllerMetadata);
for (const found of foundClasses) {
const routes = await this.discoveryService.findMethodsOfClassWithMetadata(RouteHandlerMetadata, found);
for (const route of routes) {
const usePipes = this.reflector.get(PipesMetadata, found, route);
const useGuards = this.reflector.get(GuardMetadata, found, route);
const useInterceptors = this.reflector.get(InterceptorMetadata, found, route);
const useFilters = this.reflector.get(FilterMetadata, found, route);
if (useGuards) {
callGuardsToCheck(useGaurds.guards);
}
if (useInterceptors) {
callInterceptors(useInterceptors.interceptors);
}
if (usePipes) {
callPipes(usePipes.pipes);
}
if (useFilters) {
bindFilters(useFilters.filters);
}
this.httpAdapter[route.method ?? 'use'](`${found.route}/${route.route}`, (req, res, next) => next(found[route.name](metadataFromParameters(req)));
}
}
我保證,這比代碼庫中的任何內容都更加混亂和骯臟。
但是它說明了一旦控制器的路由處理程式方法被呼叫 ( found[route.name]()) 則請求不在 Nest 的手中,直到控制器的回傳回來,因此它無法將管道系結到服務。
說了這么多,它可以匯入transform從class-transformer和validate從class-validator并運行驗證自己。除了管理對那些的呼叫并跳過對原語的呼叫之外,管道沒有做任何特殊的事情
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321765.html
上一篇:如何在python中進行驗證?
