Дублирующий URL с процедурой мутации tRPC

Вопрос или проблема

Я создал мутацию tRPC для проверки электронной почты в моей базе данных, названную verificateEmailProcedure. У меня есть промежуточное ПО, которое выполняется на каждом маршруте моего приложения, и оно блокировало эту процедуру. Каждый маршрут в моем приложении защищен, кроме нескольких, и verificateEmailProcedure является тем, который не требует аутентификации. При дальнейшем исследовании я понял, что меня блокируют потому, что запрос выполняется следующим образом:

POST /api/trpc/verificateEmailProcedure,verificateEmailProcedure?batch=1 200 за 66мс

Вот декларация:

verificateEmailProcedure: publicProcedure
    .input(z.object({ token: z.string() }))
    .mutation(async (opts) => {
      const { token } = opts.input;
      const vt = await getVerificationTokenByToken(token);

      if (!vt) {
        throw new TRPCError({
          code: "UNAUTHORIZED",
          message: "Токен не существует",
        });
      }

      if (new Date().getTime() > vt.expires.getTime()) {
        throw new TRPCError({
          code: "UNAUTHORIZED",
          message: "Токен истек",
        });
      }

      const user = await getUserByEmail(vt.email);
      if (!user) {
        throw new TRPCError({
          code: "UNAUTHORIZED",
          message: "Электронная почта не существует",
        });
      }
      await validateEmail(user.id, vt.email);
      await deleteToken(vt.id);
      return "Электронная почта проверена";
    }),

По какому-то причинам tRPC знает, какую процедуру вызывать, даже если URL выглядит так, поэтому все работает, когда я отключаю промежуточное ПО. Есть идеи, почему процедура повторяется в URL?

Ответ или решение

Ваш вопрос касается использования tRPC и проблемы, связанной с дублированием имени процедуры в URL. Давайте рассмотрим вашу ситуацию более подробно и постараемся найти решение.

Описание проблемы

Из вашего описания видно, что вы используете tRPC для реализации процедуры мутации верификации электронной почты (verificateEmailProcedure). При этом у вас есть промежуточное ПО (middleware), которое блокирует все маршруты, кроме нескольких, включая вашу процедуру verificateEmailProcedure.

Однако, когда вы делаете запрос, он выглядит следующим образом:

POST /api/trpc/verificateEmailProcedure,verificateEmailProcedure?batch=1 200 in 66ms

Вы заметили, что tRPC распознает, какую процедуру необходимо вызвать, хотя URL содержит дубликат.

Причины дублирования в URL

Дублирование процедуры в URL может происходить по нескольким причинам:

  1. Некорректная конфигурация tRPC: Возможно, вы случайно настроили маршрутизацию так, что имя процедуры перенаправляется в URL дважды.
  2. Проблемы с клиентской частью: Если ваш клиент отправляет запрос неверно (например, дублируя имя процедуры в URL), это может также приводить к такому поведению.
  3. Форматирование запросов: Если у вас есть настройки, которые дополняют запрос данными о батче или другой информации, возможно, что происходит неверное конкатенирование строки URL.

Решение проблемы

Вот несколько шагов, которые вы можете предпринять для решения проблемы:

  1. Проверьте определение маршрутов: Убедитесь, что все маршруты определены правильно и что дубликаты не добавляются в процессе конфигурации tRPC. Пример правильного определения маршрутов:

    const appRouter = createRouter()
     .query('someQuery', {
       resolve: async () => { /* ... */ },
     })
     .mutation('verificateEmailProcedure', publicProcedure
       .input(z.object({ token: z.string() }))
       .mutation(async (opts) => { /* Ваша логика верификации */ })
     );
  2. Проверьте настройки клиента: Убедитесь, что клиентская часть не дублирует вызовы. Пример вызова мутации должен выглядеть так:

    const response = await trpc.verificateEmailProcedure.mutate({ token });
  3. Анализируйте промежуточное ПО: Убедитесь, что ваше промежуточное ПО правильно обрабатывает конкретные процедуры. Возможно, вам нужно добавить условие, которое позволит обрабатывать verificateEmailProcedure, минуя аутентификацию.

  4. Логирование: Добавьте логирование в ваше промежуточное ПО и в verificateEmailProcedure, чтобы лучше понять, как проходит запрос, когда промежуточное ПО активировано.

Заключение

Ваша проблема с дублированием имени процедуры в URL может быть связана с неверной конфигурацией маршрутизации, неправильным вызовом процедуры на клиенте или ошибками в промежуточном ПО. Перепроверив перечисленные шаги, вы сможете устранить проблему и добиться корректной работы вашей процедуры верификации email.

Если после проверки вы все еще испытываете трудности, рекомендуется проверить документацию tRPC или обратиться за помощью в сообщество, так как могут быть дополнительные нюансы, специфичные для вашей реализации.

Оцените материал
Добавить комментарий

Капча загружается...