diff --git a/src/app.ts b/src/app.ts index 89b617c6..860e8b9b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -133,8 +133,11 @@ export function createAppEventHandler (stack: Stack, options: AppOptions) { return send(event, val, MIMES.html) } else if (isStream(val)) { return sendStream(event, val) + } else if (val === null) { + event.res.statusCode = 204 + return send(event) } else if (type === 'object' || type === 'boolean' || type === 'number' /* IS_JSON */) { - if (val && (val as Buffer).buffer) { + if (val.buffer) { return send(event, val) } else if (val instanceof Error) { throw createError(val) diff --git a/src/utils/response.ts b/src/utils/response.ts index 0ae4dca6..fd74c271 100644 --- a/src/utils/response.ts +++ b/src/utils/response.ts @@ -4,7 +4,7 @@ import { MIMES } from './consts' const defer = typeof setImmediate !== 'undefined' ? setImmediate : (fn: Function) => fn() -export function send (event: CompatibilityEvent, data: any, type?: string): Promise { +export function send (event: CompatibilityEvent, data?: any, type?: string): Promise { if (type) { defaultContentType(event, type) } diff --git a/test/app.test.ts b/test/app.test.ts index 67dc2f70..3f88454b 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -19,6 +19,23 @@ describe('app', () => { expect(res.body).toEqual({ url: '/' }) }) + it('can return a 204 response', async () => { + app.use('/api', () => null) + const res = await request.get('/api') + + expect(res.statusCode).toBe(204) + expect(res.text).toEqual('') + expect(res.ok).toBeTruthy() + }) + + it('can return primitive values', async () => { + const values = [true, false, 42, 0, 1] + for (const value of values) { + app.use(`/${value}`, () => value) + expect(await request.get(`/${value}`).then(r => r.body)).toEqual(value) + } + }) + it('can return Buffer directly', async () => { app.use(() => Buffer.from('

Hello world!

', 'utf8')) const res = await request.get('/')