Node.js Adapter for Hono
This adapter allows you to run your Hono application on Node.js. Initially, Hono wasn't designed for Node.js, but with this adapter, it can now be used with Node.js. It utilizes web standard APIs implemented in Node.js version 18 or higher.
While Hono is ultra-fast, it may not be as fast on Node.js due to the overhead involved in adapting Hono's API to Node.js.
However, it's worth noting that it is still faster than Express.
Requirement
- Node.js version 18 or higher.
Install
You can install from npm registry with npm
command:
npm install @hono/node-server
Or use yarn
:
yarn add @hono/node-server
Usage
Just import @hono/node-server
at the top and write the code as usual.
The same code that runs on Cloudflare Workers, Deno, and Bun will work.
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hono meets Node.js'))
serve(app, (info) => {
console.log(`Listening on http://localhost:${info.port}`)
})
For example, run it using ts-node
. Then an HTTP server will be launched. The default port is 3000
.
ts-node ./index.ts
Open http://localhost:3000
with your browser.
Options
port
serve({
fetch: app.fetch,
port: 8787,
})
createServer
import { createServer } from 'node:https'
import fs from 'node:fs'
serve({
fetch: app.fetch,
createServer: createServer,
serverOptions: {
key: fs.readFileSync('test/fixtures/keys/agent1-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent1-cert.pem'),
},
})
Middleware
Most built-in middleware also works with Node.js.
Read the documentation and use the Middleware of your liking.
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
import { prettyJSON } from 'hono/pretty-json'
const app = new Hono()
app.get('*', prettyJSON())
app.get('/', (c) => c.json({ 'Hono meets': 'Node.js' }))
serve(app)
Serve Static Middleware
Use Serve Static Middleware that has been created for Node.js.
import { serveStatic } from '@hono/node-server/serve-static'
app.use('/static/*', serveStatic({ root: './' }))
Note that root
must be relative to the current working directory - absolute paths are not supported.
Options
rewriteRequestPath
If you want to serve files in ./.foojs
with the request path /__foo/*
, you can write like the following.
app.use(
'/__foo/*',
serveStatic({
root: './.foojs/',
rewriteRequestPath: (path: string) => path.replace(/^\/__foo/, ''),
})
)
Related projects
Author
Yusuke Wada https://github.com/yusukebe
License
MIT