我们为几乎所有的url定义了一个前缀,比如&;companyname &;。为了防止它,我们在main.ts
中使用了全局前缀app.setGlobalPrefix(':companyName/');
有没有办法抓住它作为一个全局变量?
我们考虑过开发一个中间件,但我们不知道全局变量是否会对所有请求保持相同的值,或者该值会被其他请求改变。
不,将其存储为全局变量将不起作用。全局变量是唯一的,将被所有请求共享,所以正如你所猜测的,其他请求可能会改变它的值。
即使它可以工作,companyName
是你的请求的上下文,而不是你的应用程序。全局变量应该是常量值。比如数据库URI或任何在启动后不应该改变的值,但应该在整个应用程序中都可以访问。
执行您想要执行的操作的最简单方法是从控制器中的URI读取值并将该值传递给业务服务。像这样,每个请求都有自己的上下文,独立于其他请求,减少了副作用的风险。
如果您不知道如何检索值,这里有一个小示例:
检索值非常简单。就像处理经典http参数一样。您可以在文档https://docs.nestjs.com/controllers#route-parameters
中找到一些基本示例。只要可以访问URI,就可以检索这个值。
例如,在控制器中,您可以通过@Param注释获得它,如下所示:@Get('someroute')
yourRoute(
@Param('companyName') companyName: string
): {
*do something*
}
你也可以在任何类型的中间件中通过直接读取请求来访问它。
例如,在一个守卫中,你可以这样做:
async canActivate(context: ExecutionContext): Promise<boolean> {
const request: Request = context.switchToHttp().getRequest();
const companyName = request.params['companyName']
*do something*
}
希望这能回答你的问题。