mirror of
https://github.com/withastro/astro.git
synced 2024-12-16 21:46:22 -05:00
Fixes API route compat with Node 14 (#2936)
* Fixes API route compat with Node 14 * Changeset
This commit is contained in:
parent
23b8ee2738
commit
f048cdff70
4 changed files with 49 additions and 7 deletions
5
.changeset/odd-swans-walk.md
Normal file
5
.changeset/odd-swans-walk.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Fixes non-GET API routes in dev with Node 14
|
|
@ -15,6 +15,7 @@ import serverErrorTemplate from '../template/5xx.js';
|
|||
import { RouteCache } from '../core/render/route-cache.js';
|
||||
import { fixViteErrorMessage } from '../core/errors.js';
|
||||
import { createRequest } from '../core/request.js';
|
||||
import { Readable } from 'stream';
|
||||
|
||||
interface AstroPluginOptions {
|
||||
config: AstroConfig;
|
||||
|
@ -44,12 +45,17 @@ async function writeWebResponse(res: http.ServerResponse, webResponse: Response)
|
|||
const { status, headers, body } = webResponse;
|
||||
res.writeHead(status, Object.fromEntries(headers.entries()));
|
||||
if (body) {
|
||||
const reader = body.getReader();
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
if (value) {
|
||||
res.write(value);
|
||||
if(body instanceof Readable) {
|
||||
body.pipe(res);
|
||||
return;
|
||||
} else {
|
||||
const reader = body.getReader();
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
if (value) {
|
||||
res.write(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -134,7 +140,7 @@ async function handleRequest(
|
|||
await new Promise((resolve) => {
|
||||
req.setEncoding('utf-8');
|
||||
req.on('data', (bts) => bytes.push(bts));
|
||||
req.on('close', resolve);
|
||||
req.on('end', resolve);
|
||||
});
|
||||
body = new TextEncoder().encode(bytes.join('')).buffer;
|
||||
}
|
||||
|
|
|
@ -8,3 +8,13 @@ export function get() {
|
|||
])
|
||||
};
|
||||
}
|
||||
|
||||
export async function post(params, request) {
|
||||
const body = await request.text();
|
||||
return new Response(body === `some data` ? `ok` : `not ok`, {
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -36,4 +36,25 @@ describe('API routes in SSR', () => {
|
|||
const body = await response.json();
|
||||
expect(body.length).to.equal(3);
|
||||
});
|
||||
|
||||
describe('Dev', () => {
|
||||
let devServer;
|
||||
before(async () => {
|
||||
devServer = await fixture.startDevServer();
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await devServer.stop();
|
||||
});
|
||||
|
||||
it('Can POST to API routes', async () => {
|
||||
const response = await fixture.fetch('/food.json', {
|
||||
method: 'POST',
|
||||
body: `some data`
|
||||
})
|
||||
expect(response.status).to.equal(200);
|
||||
const text = await response.text();
|
||||
expect(text).to.equal(`ok`);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue