我對這種東西很陌生,所以任何建議都會受到贊賞,特別是如果有比我正在尋找的更好的方法來解決這個問題。
我試圖通過將舊端點重定向到新端點來支持它,并且兩個端點都應該支持查詢引數。每個端點都存在于一個單獨的控制器中。
示例:我想/old-namespace/getStuff?foo=bar重定向到/new-namespace/getStuff?foo=bar而不像 Nest 檔案指出的那樣手動重建查詢字串,因為引數可以是動態的。
查看NestJS 檔案,有一個方便的@Redirect裝飾器,您可以像這樣在端點上使用它,以便輕松地將請求重定向到不同的 URL:
@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
if (version && version === '5') {
return { url: 'https://docs.nestjs.com/v5/' };
}
}
但是,當使用它時,request.query在重定向時會被清除(很確定這是預期的行為)。有沒有人為此提供微創解決方案?我已經測驗了構建中間件/攔截器/自定義裝飾器來解決這個問題,并取得了不同程度的成功,但這似乎很笨拙,我希望有一種方法可以在@Redirect裝飾器之類的retainQuery = true東西中拋出一個額外的引數。
uj5u.com熱心網友回復:
我最終在這里使用了最佳答案:如何在 Nestjs 中重寫 url 路徑?
Ambroise Rabier 對 nginx rewrites 的第一個回應提示我尋找一個簡單的中間件解決方案,因為我不想在多個地方注入服務,因為會有很多從舊命名空間到新命名空間的小重定向。
在一個通用模塊中:
consumer
.apply(RewriteApiEndpointMiddleware)
.forRoutes('/')
在中間件中:
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class RewriteApiEndpointMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
// the linked answer replaced "api" but in my case I needed to send "app" requests somewhere else
req.url = req.url.replace(/^\/app/, '/new-namespace');
next();
}
}
uj5u.com熱心網友回復:
你需要的是在 nginx 中重寫。
我不知道它是否有效,但也許你可以做到這一點?
@Get('/old-namespace/getStuff')
getStuff(@Query() query) {
// Done !
getNewStuff(query);
}
@Get('/new-namespace/getStuff')
getNewStuff(@Query() query) {
}
如果沒有,您可以隨時執行以下操作:
function handleGetNewStuff() {
}
@Get('/old-namespace/getStuff')
getStuff(@Query() query) {
handleGetNewStuff(query);
}
@Get('/new-namespace/getStuff')
getNewStuff(@Query() query) {
handleGetNewStuff(query);
}
但是,如果您的問題是關于更改用戶端的鏈接(而不僅僅是內部路由),您可以嘗試(也未測驗):
@Get('/old-namespace/getStuff')
getStuff(@Req() request, @Res() response) {
const newURL = req.originalUrl.replace('old', 'new');
response.redirect(newURL);
}
請記住,NestJS 在下面使用 expressJS。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486854.html
