Description
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.