feat: add static Response.json (#1670)
* feat: add static Response.json * fix: set content-type if it doesn't exist properly
This commit is contained in:
parent
c071406e19
commit
55a4870ae5
|
@ -196,6 +196,7 @@ export class Response extends BodyMixin {
|
|||
|
||||
static error(): Response;
|
||||
static redirect(url: string, status?: number): Response;
|
||||
static json(data: any, init?: ResponseInit): Response;
|
||||
}
|
||||
|
||||
export class FetchError extends Error {
|
||||
|
|
|
@ -93,6 +93,11 @@ async function run() {
|
|||
|
||||
expectType<Response>(Response.redirect('https://google.com'));
|
||||
expectType<Response>(Response.redirect('https://google.com', 301));
|
||||
|
||||
expectType<Response>(Response.json({foo: 'bar'}));
|
||||
expectType<Response>(Response.json({foo: 'bar'}, {
|
||||
status: 301
|
||||
}));
|
||||
}
|
||||
|
||||
run().finally(() => {
|
||||
|
|
|
@ -124,6 +124,25 @@ export default class Response extends Body {
|
|||
return response;
|
||||
}
|
||||
|
||||
static json(data = undefined, init = {}) {
|
||||
const body = JSON.stringify(data);
|
||||
|
||||
if (body === undefined) {
|
||||
throw new TypeError('data is not JSON serializable');
|
||||
}
|
||||
|
||||
const headers = new Headers(init && init.headers);
|
||||
|
||||
if (!headers.has('content-type')) {
|
||||
headers.set('content-type', 'application/json');
|
||||
}
|
||||
|
||||
return new Response(body, {
|
||||
...init,
|
||||
headers
|
||||
});
|
||||
}
|
||||
|
||||
get [Symbol.toStringTag]() {
|
||||
return 'Response';
|
||||
}
|
||||
|
|
27
test/main.js
27
test/main.js
|
@ -2281,6 +2281,33 @@ describe('node-fetch', () => {
|
|||
const res = await fetch(url);
|
||||
expect(res.url).to.equal(`${base}m%C3%B6bius`);
|
||||
});
|
||||
|
||||
it('static Response.json should work', async () => {
|
||||
const response = Response.json({foo: 'bar'});
|
||||
expect(response.status).to.equal(200);
|
||||
expect(response.headers.get('content-type')).to.equal('application/json');
|
||||
expect(await response.text()).to.equal(JSON.stringify({foo: 'bar'}));
|
||||
|
||||
const response1 = Response.json(null, {
|
||||
status: 301,
|
||||
statusText: 'node-fetch',
|
||||
headers: {
|
||||
'Content-Type': 'text/plain'
|
||||
}
|
||||
});
|
||||
|
||||
expect(response1.headers.get('content-type')).to.equal('text/plain');
|
||||
expect(response1.status).to.equal(301);
|
||||
expect(response1.statusText).to.equal('node-fetch');
|
||||
|
||||
const response2 = Response.json(null, {
|
||||
headers: {
|
||||
'CoNtEnT-TypE': 'text/plain'
|
||||
}
|
||||
});
|
||||
|
||||
expect(response2.headers.get('content-type')).to.equal('text/plain');
|
||||
});
|
||||
});
|
||||
|
||||
describe('node-fetch using IPv6', () => {
|
||||
|
|
Loading…
Reference in New Issue