GoogleCloudPlatform / GoogleCloudPlatform/functions-framework-nodejs

Implicit Request interface extension causes error 'property rawBody does not exist on type'

Open
#198 2 comments 0 reactions 0 assignees View on GitHub
enhancement P3
Dominant language
TypeScript
Stars
1.4k
Forks
181
PR merge metrics
No merged PRs in 30d

Description

Cloud functions implicitly extend express Request interface with rawBody (see https://github.com/GoogleCloudPlatform/functions-framework-nodejs/blob/master/src/invoker.ts#L44):

```ts
// We optionally annotate the express Request with a rawBody field.
// Express leaves the Express namespace open to allow merging of new fields.
declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Express {
export interface Request {
rawBody?: Buffer;
}
}
}
```

I get error ` Property 'rawBody' does not exist on type 'Request'` when implement handler which uses Request.rawBody attribute like below:

```ts
import {Response, Request} from 'express';

export class HandlerClass{
public async http(request: Request, response: Response): Promise {
const body = request.rawBody;
...
}
}
```

As a workaround I have to create and use my own type instead of native Express Request:
```ts
import * as express from 'express';

export interface Request extends express.Request {
rawBody: Buffer;
}
```

If you have a look at the `firebase-functions` repository then you will see they use explicit extension of Request interface and then use it in code (https://github.com/firebase/firebase-functions/blob/master/src/providers/https.ts#L33)

I think `functions-framework-nodejs` should change implicit interface extension to explicit and provide stand-alone Request with rawBody attribute to avoid this workaround mess in depended applications code.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.