Я использую nodejs и выражаю промежуточное программное обеспечение, которое кодирует / декодирует токен, содержащий сведения о пользователе (userId, name и т. Д.) И добавляя свойство User в запрос. Мне нужно использовать одно из «пользовательских» свойств (userId) в каком-либо подписчике typeorm, чтобы написать, какой пользователь выполнил каждое обновление.
Моя архитектура очень проста, просто
(промежуточное ПО) => controller => services => DAL
TYPEORM MODELS and SUBSCRIBERS
Я не хочу передавать пользователя через все уровни (controller / services / dal).
Вопрос в том, чтоправильный способ сделать это.
См. ниже некоторые части кода
@provide(TYPES.GuardMiddleware)
class GuardMiddleware extends BaseMiddleware {
public handler(req: IRequest, res: Response, next: NextFunction) {
const token = req.headers.authorization;
if (!token) {
return next(new UnauthorizedError(warningCodes.UNAUTHENTICATED, 'No token provided'));
}
verify(token.toString(), config.Authentication.jwtAppSecret, (err: any, user: any) => {
...
req.user = user;
next();
});
}
}
@controller('/superuser', TYPES.LoggerMiddleware, TYPES.GuardMiddleware)
export class SuperUserController extends BaseController implements interfaces.Controller {
@lazyInject(TYPES.SuperUserService)
private superUserService: SuperUserService;
@lazyInject(TYPES.UserService)
private userService: UserService;
constructor() {
super();
}
@httpPost('/')
private async create(@request() req: Request, @response() res: Response, @next() esNext: NextFunction) {
const { fullName, email, password } = req.body;
// TODO REMOVE
const nemail = Date.now().toString() + email;
const newSuperUser = await this.superUserService.create(fullName, nemail, password);
return this.responseSuccess(res, successCodes.OK, 'SuperUser was successfully created', {
fullName: newSuperUser.user.fullName,
email: newSuperUser.user.email,
id: newSuperUser.id,
});
}
}
@provide(TYPES.SuperUserService)
export class SuperUserService {
@lazyInject(TYPES.SuperUserDal)
private superUserDal: SuperUserDal;
@Transaction()
public async create(fullName: string, email: string, password: string, @TransactionManager() transaction?: EntityManager): Promise<SuperUser> {
const newUser: User = [create User];
const superUser: SuperUser = await this.superUserDal.create(newUser, role, transaction);
return superUser;
}
}
@provide(TYPES.SuperUserDal)
export class SuperUserDal extends BaseDal {
public async create(user: User, role: Role, transaction?: EntityManager): Promise<SuperUser> {
const superUser = new SuperUser();
superUser.user = user;
superUser.roles = [role];
}
@Entity('superUsers')
export class SuperUser extends BaseModel implements IEntityStatus {
@PrimaryGeneratedColumn()
public id: number;
...
@AfterUpdate()
doSomethingAfterUpdate() {
console.log("event: Post entity has been updated and callback executed");
I NEED HERE THE USER_ID
}
}