Я боролся с подобной проблемой, и один из способов добиться этого - использовать модуль node-request-context
в качестве глобального регистра запроса, который предоставит вам контекст запроса.Таким образом, у вас не будет отдельных экземпляров службы, но вы можете попросить этот статический регистр предоставить вам запрос конкретного экземпляра / соединения.
https://github.com/guyguyon/node-request-context
Создать простой вспомогательный контекст:
import { createNamespace, getNamespace } from 'node-request-context';
import * as uuid from 'uuid';
export class RequestContext {
public static readonly NAMESPACE = 'some-namespace';
public readonly id = uuid.v4();
constructor(public readonly conn: Connection) { }
static create(conn: Connection, next: Function) {
const context = new RequestContext(conn);
const namespace = getNamespace(RequestContext.NAMESPACE) || createNamespace(RequestContext.NAMESPACE);
namespace.run(() => {
namespace.set(RequestContext.name, context);
next();
});
}
static currentRequestContext(): RequestContext {
const namespace = getNamespace(RequestContext.NAMESPACE);
return namespace ? namespace.get(RequestContext.name) : null;
}
static getConnection(): Connection {
const context = RequestContext.currentRequestContext();
return context ? context.conn : null;
}
}
Параметр экземпляра conn
- это ваше соединение, не стесняйтесь помещать туда другие специфичные для запроса зависимости.Также id
существует только для отладки, нет реальной необходимости использовать uuid
модуль, как я.
Создать промежуточную оболочку (это позволяет вам использовать DI здесь):
@Injectable()
export class ContextMiddleware implements NestMiddleware {
constructor(private readonly connectionManager: ...) { }
resolve(...args: any[]): MiddlewareFunction {
return (req, res, next) => {
// create the request specific connection here, probably based on some auth header...
RequestContext.create(this.connectionManager.createConnection(), next);
};
}
}
Затем зарегистрируйте новое промежуточное ПО в своем приложении Nest:
const app = await NestFactory.create(AppModule, {});
app.use(app.get(RequestLoggerMiddleware).resolve());
И, наконец, часть прибыли - получите конкретное соединение для запроса в любом месте вашего приложения:
const conn = RequestContext.getConnection();