mirror of
https://github.com/honojs/hono.git
synced 2024-12-01 10:51:01 +00:00
f29761e16b
* chore: move runtime tests into `runtime_tests` * fixed ci
135 lines
3.2 KiB
TypeScript
135 lines
3.2 KiB
TypeScript
import { Hono } from '../../src'
|
|
import { env } from '../../src/adapter'
|
|
import { HTTPException } from '../../src/http-exception'
|
|
import { basicAuth } from '../../src/middleware/basic-auth'
|
|
import { bearerAuth } from '../../src/middleware/bearer-auth'
|
|
import { etag } from '../../src/middleware/etag'
|
|
import { poweredBy } from '../../src/middleware/powered-by'
|
|
import { prettyJSON } from '../../src/middleware/pretty-json'
|
|
|
|
const app = new Hono()
|
|
|
|
// Mount Builtin Middleware
|
|
app.use('*', poweredBy())
|
|
// app.use('*', logger())
|
|
app.use(
|
|
'/basic-auth/*',
|
|
basicAuth({
|
|
username: 'hono',
|
|
password: 'acoolproject',
|
|
})
|
|
)
|
|
app.use(
|
|
'/bearer-auth/*',
|
|
bearerAuth({
|
|
token: 'secrettoken',
|
|
})
|
|
)
|
|
app.use('/etag/*', etag())
|
|
|
|
app.get('/env', (c) => {
|
|
const { NAME } = env<{ NAME: string }>(c)
|
|
return c.text(NAME)
|
|
})
|
|
|
|
// Custom Middleware
|
|
// Add Custom Header
|
|
app.use('/hello/*', async (c, next) => {
|
|
await next()
|
|
c.header('X-message', 'This is addHeader middleware!')
|
|
})
|
|
|
|
// Add X-Response-Time header
|
|
app.use('*', async (c, next) => {
|
|
const start = Date.now()
|
|
await next()
|
|
const ms = Date.now() - start
|
|
c.header('X-Response-Time', `${ms}ms`)
|
|
})
|
|
|
|
// Custom Not Found Message
|
|
app.notFound((c) => {
|
|
return c.text('Custom 404 Not Found', 404)
|
|
})
|
|
|
|
// Error handling
|
|
app.onError((err, c) => {
|
|
if (err instanceof HTTPException) {
|
|
return err.getResponse()
|
|
}
|
|
console.error(`${err}`)
|
|
return c.text('Custom Error Message', 500)
|
|
})
|
|
|
|
app.head('/', (c) => c.text('OK'))
|
|
|
|
// Routing
|
|
app.get('/', (c) => c.text('Hono!!'))
|
|
// Use Response object directly
|
|
app.get('/hello', () => new Response('This is /hello'))
|
|
|
|
app.get('/runtime', (c) => new Response(c.runtime))
|
|
|
|
// Named parameter
|
|
app.get('/entry/:id', (c) => {
|
|
const id = c.req.param('id')
|
|
return c.text(`Your ID is ${id}`)
|
|
})
|
|
|
|
// Nested route
|
|
const book = new Hono()
|
|
book.get('/', (c) => c.text('List Books'))
|
|
book.get('/:id', (c) => {
|
|
const id = c.req.param('id')
|
|
return c.text('Get Book: ' + id)
|
|
})
|
|
book.post('/', (c) => c.text('Create Book'))
|
|
app.route('/book', book)
|
|
|
|
// Redirect
|
|
app.get('/redirect', (c) => c.redirect('/'))
|
|
// Authentication required
|
|
app.get('/basic-auth/*', (c) => c.text('You are authorized'))
|
|
app.get('/bearer-auth/*', (c) => c.text('You are authorized'))
|
|
// ETag
|
|
app.get('/etag/cached', (c) => c.text('Is this cached?'))
|
|
|
|
// Async
|
|
app.get('/fetch-url', async (c) => {
|
|
const response = await fetch('https://example.com/')
|
|
return c.text(`https://example.com/ is ${response.status}`)
|
|
})
|
|
|
|
// Request headers
|
|
app.get('/user-agent', (c) => {
|
|
const userAgent = c.req.header('User-Agent')
|
|
return c.text(`Your UserAgent is ${userAgent}`)
|
|
})
|
|
|
|
// JSON
|
|
app.get('/api/posts', prettyJSON(), (c) => {
|
|
const posts = [
|
|
{ id: 1, title: 'Good Morning' },
|
|
{ id: 2, title: 'Good Aternoon' },
|
|
{ id: 3, title: 'Good Evening' },
|
|
{ id: 4, title: 'Good Night' },
|
|
]
|
|
return c.json(posts)
|
|
})
|
|
// status code
|
|
app.post('/api/posts', (c) => c.json({ message: 'Created!' }, 201))
|
|
// default route
|
|
app.get('/api/*', (c) => c.text('API endpoint is not found', 404))
|
|
|
|
app.post('/form', async (c) => {
|
|
const body = await c.req.parseBody()
|
|
return c.json(body)
|
|
})
|
|
|
|
// Throw Error
|
|
app.get('/error', () => {
|
|
throw Error('Error has occurred')
|
|
})
|
|
|
|
export const handler = app.fetch
|