Пользовательская функция, использующая хранилище в последовательности - PullRequest
1 голос
/ 07 июня 2019

Я создал пользовательскую функцию, которая должна выполняться на каждом маршруте моего сервера.

Эта функция должна получить параметр в заголовке запроса и проверить этот параметр внутри БД. (контролируется хранилищем)

как я могу получить доступ к этому хранилищу в рамках моей функции?

Я пробую разные возможности, но не могу достичь результата:

  1. создать репозиторий внутри функции (база данных кажется пустой :()
  2. попытаться передать хранилище с контроллера (все будет в порядке, но в файле последовательности у меня нет доступа ни к контроллеру, ни к хранилищу :(
  3. попробуйте включить контроллер в функцию, но вроде 2.

Я новичок в loopback и машинописи, как вы можете видеть =)

1 Ответ

0 голосов
/ 17 июня 2019

Я думаю, что вы ищете недавно представленные перехватчики, см. Перехватчики и Генератор перехватчиков .

Поскольку вы хотите вызывать свою функцию для каждого входящего запроса,Вы можете использовать Глобальный перехватчик.

как я могу получить доступ к этому репозиторию в рамках моей функции?

Написать провайдера перехватчика, он позволяет вам использовать @inject на основе зависимости-инъекция для получения хранилища.Например:

class MyRequestValidator implements Provider<Interceptor> {
  constructor(
    @repository(TokenRepository) protected tokenRepo: TokenRepository,
    @inject(RestBindings.Http.REQUEST) protected request: Request,
  ) {}

  value() {
    return this.intercept.bind(this);
  }

  async intercept<T>(
    invocationCtx: InvocationContext,
    next: () => ValueOrPromise<T>,
  ) {
    // parse the parameter from this.request.headers[name]
    const token = this.request.headers['x-my-token'];

    // call this.tokenRepo methods to query the database
    const found = await this.tokenRepo.findOne({where:{id: token}});
    const isValid = !found.expired;

    if (!isValid) {
      // throw new Error() to abort with error
      throw new HttpErrors.BadRequest('Invalid token.'));
    }

    // call next() to continue with request handling
    return next();
  }
}
...