Honoとは?

# Cloudflare# Hono

目次

Hono🔥を知る

Honoの具体的なコード(Hono未使用コードと比較)

1. クエリパラメータを扱う

Hono使用:

// Honoをインポート
import { Hono } from 'hono'

// Honoアプリケーションを初期化
const app = new Hono()

// '/greet'エンドポイントにGETリクエストが来た場合の処理
app.get('/greet', (c) => {
  // クエリパラメータ'name'を取得、なければ'World'をデフォルト値とする
  const name = c.req.query('name') || 'World'
  // レスポンスとしてテキストを返す
  return c.text(`Hello, ${name}!`)
})

// アプリケーションを起動
app.fire()

図解:

[クライアント]
  |
  | (GET /greet?name=John)
  v
[Honoアプリケーション]
  |
  | (クエリパラメータ解析)
  v
[レスポンス生成]
  |
  | ("Hello, John!")
  v
[クライアント (レスポンス受信)]

Hono未使用(Node.jsのみ):

// HTTPモジュールをインポート
const http = require('http');
// URLモジュールをインポート
const url = require('url');

// HTTPサーバーを作成
const server = http.createServer((req, res) => {
  // URLからクエリパラメータを解析
  const queryObject = url.parse(req.url,true).query;
  // 'name'クエリパラメータを取得、なければ'World'をデフォルト値とする
  const name = queryObject.name || 'World';
  // レスポンスヘッダを設定
  res.writeHead(200, {'Content-Type': 'text/plain'});
  // レスポンスボディを送信
  res.end(`Hello, ${name}!`);
});

// サーバーをポート3000で起動
server.listen(3000);

図解:

[クライアント]
  |
  | (GET /greet?name=John)
  v
[Node.js サーバー]
  |
  | (URL解析)
  | (クエリパラメータ解析)
  v
[レスポンス生成]
  |
  | ("Hello, John!")
  v
[クライアント (レスポンス受信)]

2. JSONレスポンスを返すAPIエンドポイント

Hono使用:

// Honoをインポート
import { Hono } from 'hono'

// Honoアプリケーションを初期化
const app = new Hono()

// '/data'エンドポイントにGETリクエストが来た場合の処理
app.get('/data', (c) => {
  // レスポンスとして返すデータ
  const data = { message: 'Hello, World!', numbers: [1, 2, 3] }
  // レスポンスとしてJSONを返す
  return c.json(data)
})

// アプリケーションを起動
app.fire()

図解:

[クライアント]
  |
  | (GET /data)
  v
[Honoアプリケーション]
  |
  | (JSONレスポンス生成)
  v
[レスポンス送信]
  |
  | { "message": "Hello, World!", "numbers": [1, 2, 3] }
  v
[クライアント (レスポンス受信)]

Hono未使用(Node.jsのみ):

// HTTPモジュールをインポート
const http = require('http');

// HTTPサーバーを作成
const server = http

.createServer((req, res) => {
  // レスポンスとして返すデータ
  const data = { message: 'Hello, World!', numbers: [1, 2, 3] };
  // レスポンスヘッダを設定
  res.writeHead(200, {'Content-Type': 'application/json'});
  // レスポンスボディとしてJSONを送信
  res.end(JSON.stringify(data));
});

// サーバーをポート3000で起動
server.listen(3000);

図解:

[クライアント]
  |
  | (GET /data)
  v
[Node.js サーバー]
  |
  | (JSONレスポンス生成)
  v
[レスポンス送信]
  |
  | { "message": "Hello, World!", "numbers": [1, 2, 3] }
  v
[クライアント (レスポンス受信)]

3. ミドルウェアを活用する

Hono使用:

// Honoと基本認証ミドルウェアをインポート
import { Hono } from 'hono'
import { basicAuth } from 'hono/basic-auth'

// Honoアプリケーションを初期化
const app = new Hono()

// '/protected/*'のパスに基本認証のミドルウェアを適用
app.use('/protected/*', basicAuth({ username: 'user', password: 'pass' }))

// '/protected/secret'エンドポイントにGETリクエストが来た場合の処理
app.get('/protected/secret', (c) => c.text('Secret Information'))

// アプリケーションを起動
app.fire()

図解:

[クライアント]
  |
  | (GET /protected/secret)
  v
[Honoアプリケーション]
  |
  | (認証ミドルウェア)
  | (認証成功)
  v
[レスポンス生成]
  |
  | ("Secret Information")
  v
[クライアント (レスポンス受信)]

Hono未使用(Node.jsのみ):

// HTTPと基本認証を解析するモジュールをインポート
const http = require('http');
const auth = require('basic-auth');

// HTTPサーバーを作成
const server = http.createServer((req, res) => {
  // リクエストから認証情報を取得
  const credentials = auth(req);

  // 認証情報のチェック
  if (!credentials || credentials.name !== 'user' || credentials.pass !== 'pass') {
    // 認証失敗
    res.writeHead(401, { 'WWW-Authenticate': 'Basic realm="example"' });
    res.end('Access denied');
  } else {
    // 認証成功
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Secret Information');
  }
});

// サーバーをポート3000で起動
server.listen(3000);

図解:

[クライアント]
  |
  | (GET /protected/secret)
  v
[Node.js サーバー]
  |
  | (認証情報解析)
  | (認証チェック)
  | (認証成功)
  v
[レスポンス生成]
  |
  | ("Secret Information")
  v
[クライアント (レスポンス受信)]

Honoに関する外部記事