From ee3ee485ba79977e574063717e6a83de7cd90ea1 Mon Sep 17 00:00:00 2001 From: Robin Wong Date: Fri, 16 Sep 2022 16:37:39 +0000 Subject: [PATCH 1/3] feat: use globalThis.$fetch to call API handler directly on server-side --- playground/nuxt.config.ts | 2 +- src/module.ts | 2 +- src/runtime/plugin.ts | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index 3f4a0a0..9b4ff9a 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -5,7 +5,7 @@ import Module from '../src/module' export default defineNuxtConfig({ modules: [Module], runtimeConfig: { - baseURL: 'http://localhost:3000', + baseURL: '', }, typescript: { strict: true, diff --git a/src/module.ts b/src/module.ts index f34eb3c..2df4a06 100644 --- a/src/module.ts +++ b/src/module.ts @@ -16,7 +16,7 @@ export default defineNuxtModule({ configKey: 'trpc', }, defaults: { - baseURL: 'http://localhost:3000', + baseURL: '', endpoint: '/trpc', }, async setup(options, nuxt) { diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts index 04d43c5..eef1154 100644 --- a/src/runtime/plugin.ts +++ b/src/runtime/plugin.ts @@ -10,14 +10,21 @@ export default defineNuxtPlugin((nuxtApp) => { const config = useRuntimeConfig().public.trpc const headers = useRequestHeaders() const otherHeaders = useClientHeaders() + + const baseURL = process.server ? '' : config.baseURL const client = trpc.createTRPCClient({ - url: `${config.baseURL}${config.endpoint}`, + url: `${baseURL}${config.endpoint}`, headers: () => { return { ...unref(otherHeaders), ...headers, } }, + fetch: (input, options) => + globalThis.$fetch.raw(input.toString(), options).then(response => ({ + ...response, + json: () => Promise.resolve(response._data), + })) }) nuxtApp.provide('client', client) From 453845fb146e60e741f44a2a4e1da7510d810645 Mon Sep 17 00:00:00 2001 From: Robin Wong Date: Sun, 18 Sep 2022 08:44:43 +0000 Subject: [PATCH 2/3] fix: eslint errors --- src/runtime/plugin.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts index eef1154..427b444 100644 --- a/src/runtime/plugin.ts +++ b/src/runtime/plugin.ts @@ -20,11 +20,11 @@ export default defineNuxtPlugin((nuxtApp) => { ...headers, } }, - fetch: (input, options) => + fetch: (input, options) => globalThis.$fetch.raw(input.toString(), options).then(response => ({ ...response, json: () => Promise.resolve(response._data), - })) + })), }) nuxtApp.provide('client', client) From 7962c7f61ee2aebf3d1abf55a1eb952b4e9955ae Mon Sep 17 00:00:00 2001 From: Robin Wong Date: Sun, 18 Sep 2022 09:46:59 +0000 Subject: [PATCH 3/3] fix: return original FetchResponse when ohmyfetch throws error --- src/runtime/plugin.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts index 427b444..ad17d2c 100644 --- a/src/runtime/plugin.ts +++ b/src/runtime/plugin.ts @@ -1,5 +1,6 @@ import * as trpc from '@trpc/client' import { unref } from 'vue' +import { FetchError } from 'ohmyfetch' import { useClientHeaders } from './client' import { defineNuxtPlugin, useRequestHeaders, useRuntimeConfig } from '#app' import type { router } from '~/server/trpc' @@ -21,10 +22,17 @@ export default defineNuxtPlugin((nuxtApp) => { } }, fetch: (input, options) => - globalThis.$fetch.raw(input.toString(), options).then(response => ({ - ...response, - json: () => Promise.resolve(response._data), - })), + globalThis.$fetch.raw(input.toString(), options) + .catch((e) => { + if (e instanceof FetchError && e.response) + return e.response + + throw e + }) + .then(response => ({ + ...response, + json: () => Promise.resolve(response._data), + })), }) nuxtApp.provide('client', client)