h3 icon indicating copy to clipboard operation
h3 copied to clipboard

Can't readBody on a GET request

Open julesfrn opened this issue 9 months ago • 0 comments

Hello,

I am getting an error when I use the readBody() function on a get Request. After checking out the implementation I realised that it's a normal behaviour as it is specified in the code : https://github.com/unjs/h3/blob/58e33ff00b1db1cf86a780bf8b152c3f7e573350/src/utils/body.ts#L44

I wonder why we want this specific behaviour, and not just return undefined like the function does for a POST request with no body.

I am not trying to make GET requests with a payload but I made a custom route array and registered them generically in my h3 router by looping on my array of routes so I use the readBody function for any routes no matter the verb.

const wrapHandler = (handler: HTTPHandler) => async (event: H3Event<EventHandlerRequest>) => {
    const request: HTTPRequest = {
      payload: await readBody(event),
      query: getQuery(event),
      params: getRouterParams(event)
    }
    const { status, body } = await handler(request)
    setResponseStatus(event, status)
    return body
  }

  routes.forEach(({ path, handler, method }) => {
    console.log(`Registering route : ${method} /api${path}`)
    nitroApp.router.use(`/api${path}`, defineEventHandler(wrapHandler(handler)), method)
  })

I feel like I should be able to do this but if not, do you have any suggestions on how I should handle this ? I dont want to have to write an if ('post' || 'put' || 'patch'....) because I'm not supposed to know what h3 considers as a "PayloadMethod". Maybe h3 should expose a method isPayloadMethod() so that i can use readBody() onfy if the previous function returns true

Thank you for your answers

julesfrn avatar May 09 '24 16:05 julesfrn