Skip to content

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

Open
@dobromyslov

Description

@dobromyslov

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

// 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<ParamsDictionary>' when implement handler which uses Request.rawBody attribute like below:

import {Response, Request} from 'express';

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

As a workaround I have to create and use my own type instead of native Express Request:

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions