expressjs / expressjs/express

Response built by express is broken if res and req don't extend node's http.IncomingMessage and http.ServerResponse

Open
#6,039 1 comment 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
JavaScript
Stars
69.5k
Forks
25k
Avg merge
4d 20h
Merged PRs (30d)
9

Description

To reproduce

```js
import createApp from 'express';

const app = createApp();
console.log(app.response);

console.log(app.response.getHeader('vary'));
```

```js
import createApp from 'express';
import {IncomingMessage} from 'unenv/runtime/node/http/_request'
import {ServerResponse} from 'unenv/runtime/node/http/_response'

const req = new IncomingMessage();
const res = new ServerResponse(req);

// Taken from express init middleware implementation
const app = createApp();
Object.setPrototypeOf(res, app.response);

res.setHeader('vary', 'test'); // TypeError: Cannot set properties of undefined (setting 'vary')
```

```txt
node:_http_outgoing:747
const entry = headers[name.toLowerCase()];
^

TypeError: Cannot read properties of undefined (reading 'vary')
at ServerResponse.getHeader (node:_http_outgoing:747:24)
```

Because the non native response methods are being overwritten with the native methods

Solution:

```js

var request = require('./request');

/**
* Response prototype.
* @public
*/

var res = new http.ServerResponse(request)
```

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.