dx-server - modern, unopinionated, and satisfactory server
Install
yarn add dx-server jchain
Usage
Check below sample with comment for more details.
import {Server} from 'http'
import {promisify} from 'util'
import {
requestContext, responseContext,
expressContext, setHtml, setJson,
bufferBodyContext,
jsonBodyContext,
queryContext,
rawBodyContext,
textBodyContext,
urlencodedBodyContext,
router,
catchApiError, catchError, notFound, notFoundApi,
expressApp,
} from 'dx-server'
const tcpServer = new Server()
.on('request', async (req, res) => {
try {
await chain(
requestContext.chain(req),
responseContext.chain(res),
expressContext.chain({jsonBeautify: true}),
bufferBodyContext.chain(),
jsonBodyContext.chain(),
urlencodedBodyContext.chain(),
textBodyContext.chain(),
rawBodyContext.chain(),
queryContext.chain(),
next => {
responseContext.value.setHeader('cache-control', 'no-cache')
next()
},
async next => {
try {
await next()
} catch (e) {
console.error(e)
setHtml('internal server error', {status: 500})
}
},
expressApp(app => {
app.use('/photos', express.static('photos'))
}),
router.post({
async '/api'({next}) {
try {
await next()
} catch (e) {
console.error(e)
setJson({
message: 'internal server error',
code: 'internal_server_error'
}, {status: 500})
}
}
}, {end: false}),
router.post({
'/api/me'() {
setJson({name: 'joe'})
}
}),
router.get({
'/'() {
setHtml('ok')
},
'/health'() {
setHtml('ok')
}
}),
router.post({
'/api'() {
setJson({
message: 'not found',
code: 'not_found'
}, {status: 404})
}
}, {end: false}),
() => {
setHtml('not found', {status: 404})
},
)()
} catch (e) {
console.error(e)
}
})
const port = +(process.env.PORT ?? 3000)
await promisify(tcpServer.listen.bind(tcpServer))(port)
console.log(`server is listening at ${port}`)
TODO
Until these middlewares are available as native dx-server middlewares, express middlewares can be used with expressApp()