📮 Japan Post ドライバー
Japan Post ドライバーは、郵便番号による住所検索のために Japan Post Digital Address API (v1) と統合します。OAuth2 クライアント認証、トークンキャッシュ、レスポンス正規化を処理します。
ドライバーを findAddressDriver として注入し、住所サービス とともに使用します。
🎯 概要
import {drivers} from '@nodeblocks/backend-sdk';
const {createJapanPostDriver} = drivers;
const findAddressDriver = createJapanPostDriver(
process.env.JAPAN_POST_CLIENT_ID!,
process.env.JAPAN_POST_SECRET_KEY!,
process.env.JAPAN_POST_HOSTNAME, // 省略可。既定値は 'api.da.pf.japanpost.jp'
);
📋 利用可能な Japan Post ドライバー
createJapanPostDriver
Japan Post の住所検索ドライバーを作成します。これは同期ファクトリーのため、await は不要です。
パラメーター:
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
clientId | string | — | Japan Post Digital Address API のクライアント ID |
secretKey | string | — | Japan Post Digital Address API のシークレットキー |
hostname? | string | 'api.da.pf.japanpost.jp' | API ホスト名(テストにはサンドボックスのホスト名を使用) |
戻り値: findAddress(postalCode) を持つ JapanPostDriver オブジェクト
使用例:
import {drivers} from '@nodeblocks/backend-sdk';
const {createJapanPostDriver} = drivers;
const driver = createJapanPostDriver(
process.env.JAPAN_POST_CLIENT_ID!,
process.env.JAPAN_POST_SECRET_KEY!,
process.env.JAPAN_POST_HOSTNAME,
);
const address = await driver.findAddress('100-0001');
// { prefecture: '東京都', city: '千代田区', town: '千代田', postalCode: '1000001' }
JapanPostDriver
SDK ソースの src/drivers/japan-post.ts で、ReturnType<typeof createJapanPostDriver> として定義される型エイリアスです。
type JapanPostDriver = {
findAddress(postalCode: string): Promise<{
prefecture: string;
city: string;
town?: string;
postalCode: string;
} | null>;
};
この型は drivers 名前空間からエクスポートされます。JapanPostDriver は src/blocks/address.ts の FindAddressDriver 契約を満たし、住所サービスが findAddressDriver として注入します。検索結果がない場合、ドライバーは null を返します。住所ブロックはその値を err(new AddressNotFoundError('No matching address found.')) に変換します。
findAddress
郵便番号から日本の住所を検索します。
| パラメーター | 型 | 説明 |
|---|---|---|
postalCode | string | ハイフンの有無を問わない郵便番号(7 桁へ正規化できる必要があります) |
戻り値: Promise<{ prefecture: string; city: string; town?: string; postalCode: string } | null>
| 結果 | 動作 |
|---|---|
| 住所あり | { prefecture, city, town?, postalCode }。postalCode は API の zip_code フィールド(最初の住所エントリー)から取得します。 |
| 未検出(HTTP 404) | null |
addresses 配列が空(HTTP 200) | null |
| 形式が不正 | Error: Invalid postal code format: "${postalCode}". Expected 7 digits (hyphens allowed). をスローします。 |
| API エラー(有効なエラースキーマ) | Error(data.message) をスローします。 |
| トークン/レスポンススキーマの不一致 | Error('Japan Post driver error.', { cause }) をスローします。 |
動作の詳細:
- 検証および API リクエストの前にハイフンを取り除きます。
- 正規化後の郵便番号が
/^\d{7}$/に一致することを検証します。 - トークンおよび住所レスポンスは、返す前に AJV スキーマで検証します。
- 本文
{ client_id, grant_type: 'client_credentials', secret_key }を使ってPOST https://{hostname}/api/v1/j/tokenで OAuth2 トークンを取得し、期限切れまでaccessTokenExpiresAtにキャッシュします。 Authorization: Bearer {token}を付けてGET /api/v1/searchcode/{postalCode}?searchtype=2で住所を検索します。- 返されたすべての住所に町名が 1 つだけ存在する場合にのみ
townを設定します('以下に掲載がない場合'を除く)。
住所サービスを通じた正規化: 住所ブロック(
src/blocks/address.tsのfindAddress)はドライバー呼び出し前にハイフンを取り除き、その後ドライバーが再度/^\d{7}$/を検証します。ドライバーの直接呼び出しではハイフン付き入力を受け入れますが、住所サービス経由の呼び出しは正規化済みでドライバーに到達します。
例:
await driver.findAddress('100-0001'); // ハイフンあり
await driver.findAddress('1000001'); // ハイフンなし
await driver.findAddress('999-9999'); // null — 見つからない場合
await driver.findAddress('12');
// Error をスロー: Invalid postal code format: "12". Expected 7 digits (hyphens allowed).
🔧 Japan Post ドライバーの使用
サービスでの使用
addressService の第 3 引数のオプションを通じてドライバーを注入します。
import {services, drivers, utils} from '@nodeblocks/backend-sdk';
const {addressService} = services;
const {createJapanPostDriver} = drivers;
const {createCache} = utils;
const findAddressDriver = createJapanPostDriver(
process.env.JAPAN_POST_CLIENT_ID!,
process.env.JAPAN_POST_SECRET_KEY!,
process.env.JAPAN_POST_HOSTNAME,
);
addressService(
{identities},
{
authSecrets: {
authEncSecret: process.env.AUTH_ENC_SECRET!,
authSignSecret: process.env.AUTH_SIGN_SECRET!,
},
findAddressCache: createCache(),
},
{findAddressDriver},
);
完全な Express 配線、認証、キャッシュ設定は、住所サービス を参照してください。