Performant request scope dependency injection for NestJS framework using express server
nj-request-scope library solves NestJs request-scope dependency injection problems:
- bubbling up the injection chain - NestJS documentation
- request-scope performance issues - NestJS documentation
This solution is based on the build-in javascript Proxy design pattern. For every request, only the proxy's target object is changed to the new request-scope instance instead of creating all injection chain objects.
npm install nj-request-scope
There are also a few peer dependencies that have to be satisfied:
"@nestjs/common": ">8.0.0",
"@nestjs/core": ">8.0.0",
"@nestjs/platform-express": ">8.0.0",
"express-http-context": "^1.2.4",
"reflect-metadata": "^0.1.12",
"rxjs": "^7.1.0"
Especially express-http-context
which is not required by NestJS by default.
nj-request-scope was tested with NestJs 8.x & 9.x
To use nj-request-scope in NestJS module you have to add import of RequestScopeModule
in the module class decorator:
import { RequestScopeModule } from 'nj-request-scope';
@Module({
imports: [RequestScopeModule],
})
Next, there are two ways of using nj-request-scope.
- Inject express request object into class constructor with
NJRS_REQUEST
token:
import { NJRS_REQUEST } from 'nj-request-scope';
[...]
constructor(@Inject(NJRS_REQUEST) private readonly request: Request) {}
- Change class inject scope to request-scope with
@RequestScope()
decorator:
import { RequestScope } from 'nj-request-scope';
@Injectable()
@RequestScope()
export class RequestScopeService {
Proxy handler implements only most common methods:
get
has
set
getPrototypeOf
getOwnPropertyDescriptor
ownKeys
If you need other methods implemented please feel free to contribute. ProxyHandler implementation
https://github.com/kugacz/nj-request-scope-example
nj-request-scope is MIT licensed.