Вопрос или проблема
Я создал мутацию 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 может происходить по нескольким причинам:
- Некорректная конфигурация tRPC: Возможно, вы случайно настроили маршрутизацию так, что имя процедуры перенаправляется в URL дважды.
- Проблемы с клиентской частью: Если ваш клиент отправляет запрос неверно (например, дублируя имя процедуры в URL), это может также приводить к такому поведению.
- Форматирование запросов: Если у вас есть настройки, которые дополняют запрос данными о батче или другой информации, возможно, что происходит неверное конкатенирование строки URL.
Решение проблемы
Вот несколько шагов, которые вы можете предпринять для решения проблемы:
-
Проверьте определение маршрутов: Убедитесь, что все маршруты определены правильно и что дубликаты не добавляются в процессе конфигурации tRPC. Пример правильного определения маршрутов:
const appRouter = createRouter() .query('someQuery', { resolve: async () => { /* ... */ }, }) .mutation('verificateEmailProcedure', publicProcedure .input(z.object({ token: z.string() })) .mutation(async (opts) => { /* Ваша логика верификации */ }) );
-
Проверьте настройки клиента: Убедитесь, что клиентская часть не дублирует вызовы. Пример вызова мутации должен выглядеть так:
const response = await trpc.verificateEmailProcedure.mutate({ token });
-
Анализируйте промежуточное ПО: Убедитесь, что ваше промежуточное ПО правильно обрабатывает конкретные процедуры. Возможно, вам нужно добавить условие, которое позволит обрабатывать
verificateEmailProcedure
, минуя аутентификацию. - Логирование: Добавьте логирование в ваше промежуточное ПО и в
verificateEmailProcedure
, чтобы лучше понять, как проходит запрос, когда промежуточное ПО активировано.
Заключение
Ваша проблема с дублированием имени процедуры в URL может быть связана с неверной конфигурацией маршрутизации, неправильным вызовом процедуры на клиенте или ошибками в промежуточном ПО. Перепроверив перечисленные шаги, вы сможете устранить проблему и добиться корректной работы вашей процедуры верификации email.
Если после проверки вы все еще испытываете трудности, рекомендуется проверить документацию tRPC или обратиться за помощью в сообщество, так как могут быть дополнительные нюансы, специфичные для вашей реализации.