serverless-express icon indicating copy to clipboard operation
serverless-express copied to clipboard

Express v5 and body-parser v2 not compatible with serverless-express

Open mattiasnixell opened this issue 3 years ago • 3 comments

Hello! It seems like express v5 and its bundled body-parser v2 do not work with serverless-express. The body-parser dependency has changed its internals to use "on-finished" dependency to check if the body is parsed already. It does so by checking if the request stream has "completed" set to true. The requests from serverless-express are always "completed" when it reaches the express app, i.e. the body-parser thinks the body is already parsed and skips parsing e.g. JSON content.

Code that always sets request to completed: https://github.com/vendia/serverless-express/blob/f3f9c50f6dfcdbaf84af6ca64e77af1ba8b34bf0/src/request.js#L20

The "on-finished" code that checks if the request body is already parsed: https://github.com/jshttp/on-finished/blob/1111fe8e913debaf3da9bd4f6bda216ef36097fa/index.js#L76

Here's the change in body-parser which start using the "on-finished": https://github.com/expressjs/body-parser/compare/1.20.0...v2.0.0-beta.1#diff-c0749b151a7ec0288a6a4c849ff5215ec9ddeef8fa799a5cecef4b320a7dcf00R100

Here's example code:

import express from 'express'; // ^5.0.0-beta.1
import serverlessExpress from '@vendia/serverless-express'; // ^4.8.0

const app = express();
app.use(express.json());
app.post('/example', (req, res) => {
  console.log('body', req.body);
})

export const handler = serverlessExpress({ app });

Calling POST /example prints a "Buffer" object. If you enable debugging for body-parser (set env flag DEBUG=body-parser:*), then it prints out "body-parser:json body already parsed".

How can this be solved? I am afraid that if the request has "completed" to false, it might have unexpected consequences as well.

mattiasnixell avatar May 03 '22 06:05 mattiasnixell

Oh no, are they actually going to release express v5? The best thing about Express is how it never changes and code that integrates with it never has to be updated :)

glasser avatar May 05 '22 22:05 glasser

@mattiasnixell Can you send your Request headers? I guess that you headers that you headers is missing Content-Type attribute.

Another information, the Lambda Function expect receive headers and multiValueHeaders, so you can factory this using event.multiValueHeaders = event.headers. Will be resolved, I expect.

thadeu avatar Mar 30 '23 15:03 thadeu