Response built by express is broken if res and req don't extend node's http.IncomingMessage and http.ServerResponse
- 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
Assessment
This issue has not been assessed yet.