Koa JSON response body streaming for async iterators
const jsonAsyncIterator = require('@koa/json-async-iterator')
const app = new Koa()
app.use(jsonAsyncIterator())
app.use(async ctx => {
const iterator = async function* () {
yield Promise.resolve({ foo: 'bar' })
yield Promise.resolve({ baz: 'qux' })
}
ctx.body = iterator()
})
Output:
[
{"foo":"bar"}
,
{"baz":"qux"}
]
Example with PostgreSQL:
import QueryStream from 'pg-query-stream'
import pg from 'pg'
const client = new pg.Client()
await client.connect()
// later in your middleware
app.use(async (ctx) => {
// stream all the rows from the database to the client
ctx.body = client.query(new QueryStream(`
SELECT *
FROM posts
ORDER BY id ASC
`))
})
The string to write before the first value in the iterator.
Default: '[\n'
The string to write between each value in the iterator.
Default: '\n,\n'
The string to write after the last value in the iterator.
Default: '\n]'
A function that takes an error and returns a value to be stringified.
Default: (err) => ({ error: { message: err.message } })
Whether to pretty-print the JSON.
Default: false
The number of spaces to use for pretty-printing.
Default: 2
MIT