expressjs / body-parser

Node.js body parsing middleware
MIT License
5.44k stars 727 forks source link

BadRequestError: request size did not match content length #494

Closed MudabbarHussain closed 11 months ago

MudabbarHussain commented 1 year ago

When I hit the API to get a user having the particular email I got the following error. BadRequestError: request size did not match content length here is: request body: { "email":"ali@gmail.com" } Code snippet this.router.get('/by-email', async (req, res) => { try { const {email} = req.body; const data = await new userController().getOneUser(email); res.status(200).send(data); } catch (error) { res.send(error); } }); please help me to resolve this issue.

dougwilson commented 1 year ago

Hi, and sorry you are having an issue. There isn't enough information to be able to diagnose your issue. Please, can you provide the exact method and details to reproduce this issue? Specifically the exact details to send the request.

WilliamLoey commented 1 year ago

Looking at your code snippet, it appears that you are using the HTTP GET method to retrieve a user by email, but you are passing the email as part of the request body. The HTTP GET method does not have a request body, so this is likely causing the issue.

To fix this, you can pass the email as a query parameter instead of in the request body. Here's an updated version of your code:

this.router.get('/by-email', async (req, res) => {
  try {
    const { email } = req.query;
    const data = await new userController().getOneUser(email);
    res.status(200).send(data);
  } catch (error) {
    res.send(error);
  }
});
Brahmah commented 11 months ago

Just an FYI, I was getting the same error using this lib without express.

image
dougwilson commented 11 months ago

Thank you for the update and sorry we have been unable to fix. Unfortunately without a reproducable example and code to demo we don't know what the problem is. You are always welcome to make a pull request qoth a fiz, or if you can provide a reproducable example we can reopen this issue and figure out what is happening and fix.

Brahmah commented 11 months ago

Hey @dougwilson

Looks like the issue was with the raw-body dependency.

For my use, I've since patched the package with a fix

We started sporadically getting these errors since switching to uWebSockets.js with https://github.com/colyseus/uWebSockets-express, usually when the req body contained any chars that were larger than a single byte.

This is because chunks were measured via their char length instead of bytes...

I recognise that this isn't a documented canonical use of the library so your prerogative to determine what's best.

dougwilson commented 11 months ago

Ah, I see. The issue is actually not in raw-body, but in that uwebsockets lib. It will utf-8 decode the body before it sends it to raw-body:

https://github.com/colyseus/uWebSockets-express/blob/68c60fe77dba469021da85ce9fe4adda6d407eaa/src/IncomingMessage.ts#L166

https://github.com/colyseus/uWebSockets-express/blob/68c60fe77dba469021da85ce9fe4adda6d407eaa/src/IncomingMessage.ts#L178

This will of course mean any binary data will end up corrupted with that uwebsockets lib. It looks like that is why raw-body is unexpectedly getting a decoded string instead of Buffer objects like would happen with the actual Node.js http objects.

I would suggest fixing at the root cause instead of raw-body, as it would also fix corruption of non-utf-8 bodies too.

Brahmah commented 11 months ago

Agreed @dougwilson, thanks for picking up on that!

This was merely a quick fix to bring back prod services after we found out about the regression affecting all requests from a particular client, until I could investigate further.

Agree that patching uwebsockets-express would be far more apposite so will get to that shortly...

https://github.com/colyseus/uWebSockets-express/blob/68c60fe77dba469021da85ce9fe4adda6d407eaa/src/IncomingMessage.ts#L178