🔧 共通ユーティリティ
Nodeblocks SDKは、一般的な操作のための汎用ユーティリティ関数を提供します。これらのユーティリティは、アプリケーション全体で頻繁に使用されるUUID生成や型チェックなどの基本的なタスクを処理します。
🎯 概要
共通ユーティリティは、日常的なプログラミングタスクのための必須ヘルパー関数を提供します。一般的な操作のシンプルさと信頼性に重点を置いています。
主要機能
- UUID生成: 信頼性のあるUUID v4生成
- 型チェック: オブジェクト型検証
- クロスプラットフォーム: 異なる環境での一貫した動作
- 軽量: 最小限の依存関係とオーバーヘッド
🆔 UUID生成
generateUUID
一意識別子用のUUID v4文字列を生成します。
import { utils } from '@nodeblocks/backend-sdk';
const { generateUUID } = utils;
const id = generateUUID();
// 戻り値: "550e8400-e29b-41d4-a716-446655440000"
使用例
import { utils } from '@nodeblocks/backend-sdk';
const { generateUUID } = utils;
// 一意IDを生成
const userId = generateUUID();
const sessionId = generateUUID();
const requestId = generateUUID();
// オブジェクトで使用
const user = {
id: generateUUID(),
name: 'John Doe',
email: 'john@example.com'
};
// 複数IDを生成
const ids = Array.from({ length: 5 }, () => generateUUID());
// ファイル名に使用
const filename = `upload-${generateUUID()}.jpg`;
// リクエストトラッキング
const trackingId = generateUUID();
console.log(`Processing request: ${trackingId}`);
ベストプラクティス
// 良い - 一意性が保証されるUUIDを使用
const entityId = generateUUID();
// 悪い - 衝突の可能性があるランダム数値
const entityId = Math.random().toString();
// 良い - データベースキーとして使用
const user = {
id: generateUUID(),
email: 'user@example.com'
};
// 悪い - 予測可能なカウンター
let userCounter = 1;
const user = {
id: `user-${userCounter++}`,
email: 'user@example.com'
};
🔍 型チェック
isObject
値がオブジェクト型(null以外)かどうかを検証します。
import { utils } from '@nodeblocks/backend-sdk';
const { isObject } = utils;
// 基本的な使用
console.log(isObject({})); // true
console.log(isObject({ a: 1 })); // true
console.log(isObject([])); // true (配列もオブジェクト)
console.log(isObject(null)); // false
console.log(isObject(undefined)); // false
console.log(isObject('string')); // false
console.log(isObject(123)); // false
実用的な使用例
import { utils } from '@nodeblocks/backend-sdk';
const { isObject } = utils;
// リクエストボディの検証
const validateRequestBody = (body: any) => {
if (!isObject(body)) {
throw new Error('リクエストボディはオブジェクトである必要があります');
}
if (Object.keys(body).length === 0) {
throw new Error('リクエストボディは空にできません');
}
return body;
};
// 設定オブジェクトの検証
const mergeConfigs = (defaultConfig: any, userConfig: any) => {
if (!isObject(defaultConfig)) {
throw new Error('デフォルト設定はオブジェクトである必要があります');
}
if (userConfig && !isObject(userConfig)) {
throw new Error('ユーザー設定はオブジェクトである必要があります');
}
return { ...defaultConfig, ...userConfig };
};
// データベース結果の検証
const processDbResult = (result: any) => {
if (!isObject(result)) {
throw new Error('無効なデータベース結果');
}
return result;
};
🔄 配列ユーティリティ
isArray
値が配列かどうかを検証します。
import { utils } from '@nodeblocks/backend-sdk';
const { isArray } = utils;
console.log(isArray([])); // true
console.log(isArray([1, 2, 3])); // true
console.log(isArray({})); // false
console.log(isArray('string')); // false
console.log(isArray(null)); // false
使用例
import { utils } from '@nodeblocks/backend-sdk';
const { isArray } = utils;
// 配列データの処理
const processItems = (items: any) => {
if (!isArray(items)) {
throw new Error('アイテムは配列である必要があります');
}
return items.map(item => processItem(item));
};
// フィルタリング関数
const filterValidItems = (data: any) => {
if (!isArray(data)) {
return [];
}
return data.filter(item => isObject(item) && item.isValid);
};
🎯 型安全なヘルパー
hasProperty
オブジェクトが特定のプロパティを持つかどうかを検証します。
import { utils } from '@nodeblocks/backend-sdk';
const { hasProperty } = utils;
const user = { id: '123', name: 'John' };
console.log(hasProperty(user, 'id')); // true
console.log(hasProperty(user, 'email')); // false
// 安全なプロパティアクセス
const getUserEmail = (user: any) => {
if (!isObject(user)) {
return null;
}
if (!hasProperty(user, 'email')) {
return null;
}
return user.email;
};
isEmpty
値が空かどうかを検証します。
import { utils } from '@nodeblocks/backend-sdk';
const { isEmpty } = utils;
console.log(isEmpty(null)); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty('')); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
console.log(isEmpty('hello')); // false
console.log(isEmpty([1, 2])); // false
console.log(isEmpty({ a: 1 })); // false
// バリデーションでの使用
const validateInput = (input: any) => {
if (isEmpty(input)) {
throw new Error('入力は空にできません');
}
return input;
};
🔧 文字列ユーティリティ
slugify
文字列をURL対応のスラッグに変換します。
import { utils } from '@nodeblocks/backend-sdk';
const { slugify } = utils;
console.log(slugify('Hello World')); // 'hello-world'
console.log(slugify('商品名123')); // 'shang-pin-ming-123'
console.log(slugify('Special@Chars!')); // 'special-chars'
// ブログ投稿URLの生成
const createPostUrl = (title: string) => {
const slug = slugify(title);
return `/blog/${slug}`;
};
// ファイル名の正規化
const normalizeFilename = (filename: string) => {
const [name, ext] = filename.split('.');
return `${slugify(name)}.${ext}`;
};
🎯 デバッグユーティリティ
inspect
オブジェクトを人間が読める形式で出力します。
import { utils } from '@nodeblocks/backend-sdk';
const { inspect } = utils;
const complexObject = {
user: { id: '123', profile: { name: 'John' } },
items: [1, 2, 3],
metadata: { created: new Date() }
};
console.log(inspect(complexObject));
// 整形された出力で深いネストオブジェクトも表示
// デバッグログでの使用
const debugLog = (label: string, data: any) => {
console.log(`[DEBUG] ${label}:`, inspect(data));
};
🔄 パフォーマンスユーティリティ
throttle
関数の実行頻度を制限します。
import { utils } from '@nodeblocks/backend-sdk';
const { throttle } = utils;
// APIコールの制限
const throttledSearch = throttle((query: string) => {
return searchAPI(query);
}, 300); // 300ms間隔で制限
// ログ出力の制限
const throttledLog = throttle((message: string) => {
console.log(message);
}, 1000); // 1秒間隔で制限
debounce
関数の実行を遅延させ、頻繁な呼び出しを防ぎます。
import { utils } from '@nodeblocks/backend-sdk';
const { debounce } = utils;
// 入力検証の遅延
const debouncedValidation = debounce((input: string) => {
return validateInput(input);
}, 500); // 500ms後に実行
// 自動保存機能
const debouncedSave = debounce((data: any) => {
return saveToDatabase(data);
}, 2000); // 2秒後に実行
🎯 ベストプラクティス
1. 型チェックの使用
// 良い - 適切な型チェック
const processData = (data: any) => {
if (!isObject(data)) {
throw new Error('データはオブジェクトである必要があります');
}
if (!isArray(data.items)) {
throw new Error('アイテムは配列である必要があります');
}
return data;
};
// 悪い - 型チェックなし
const processData = (data: any) => {
return data.items.map(item => item.value); // 実行時エラーの可能性
};
2. UUID使用の一貫性
// 良い - 一貫したUUID使用
const createEntity = (data: any) => {
return {
id: generateUUID(),
...data,
createdAt: new Date().toISOString()
};
};
// 悪い - 不一致なID生成
const createEntity = (data: any) => {
return {
id: Math.random().toString(36), // 予測可能
...data
};
};
3. エラーハンドリング
// 良い - 適切なエラーメッセージ
const validateUser = (user: any) => {
if (!isObject(user)) {
throw new Error('ユーザーオブジェクトが必要です');
}
if (isEmpty(user.email)) {
throw new Error('メールアドレスが必要です');
}
return user;
};
// 悪い - 曖昧なエラー
const validateUser = (user: any) => {
if (!user || !user.email) {
throw new Error('Invalid user'); // 不明確
}
return user;
};
➡️ 次へ
ハンドラーラッパーについて学習して、ログや機能を任意のハンドラーに追加する方法を理解しましょう!