backend-patterns
1
总安装量
1
周安装量
#48544
全站排名
安装命令
npx skills add https://github.com/kimny1143/claude-code-template --skill backend-patterns
Agent 安装分布
mcpjam
1
claude-code
1
replit
1
windsurf
1
zencoder
1
Skill 文档
backend-patterns – ããã¯ã¨ã³ããã¿ã¼ã³é
ããã¯ã¨ã³ãã³ã¼ãè¦ç´ã¨ãã¿ã¼ã³ã
ä½¿ãæ¹
æ°ããAPIã«ã¼ããä½ãæããã®ã¹ãã«ãåç
§
1. APIã«ã¼ãæ§é
èªè¨¼ãã¿ã¼ã³ï¼Next.jsä¾ï¼
// èªè¨¼ããã«ã¦ã§ã¢ã使ç¨
import { withAuth } from '@/lib/middleware/with-auth';
import { apiSuccess, apiError } from '@/lib/api-response';
export const GET = withAuth(async ({ userId, request }) => {
const data = await repository.findByUserId(userId);
return apiSuccess({ data });
});
export const POST = withAuth(async ({ userId, request }) => {
const body = await request.json();
// ããªãã¼ã·ã§ã³ & å¦ç
return apiSuccess({ created: result });
});
Express.jsä¾
import { Router } from 'express';
import { authenticate } from '@/middleware/auth';
import { validate } from '@/middleware/validate';
const router = Router();
router.get('/', authenticate, async (req, res) => {
const data = await repository.findByUserId(req.user.id);
res.json({ success: true, data });
});
router.post('/', authenticate, validate(createSchema), async (req, res) => {
const result = await repository.create(req.body);
res.status(201).json({ success: true, data: result });
});
2. ã¬ã¹ãã³ã¹å½¢å¼
çµ±ä¸ã¬ã¹ãã³ã¹
// lib/api-response.ts
export function apiSuccess<T>(data: T, options?: { status?: number }) {
return Response.json(
{ success: true, data, timestamp: new Date().toISOString() },
{ status: options?.status ?? 200 }
);
}
export function apiError(message: string, options?: { status?: number; code?: string }) {
return Response.json(
{ success: false, error: message, code: options?.code, timestamp: new Date().toISOString() },
{ status: options?.status ?? 400 }
);
}
ã¬ã¹ãã³ã¹å½¢å¼
// æå
{
"success": true,
"data": { ... },
"timestamp": "2026-01-19T12:00:00.000Z"
}
// ã¨ã©ã¼
{
"success": false,
"error": "Error message",
"code": "ERROR_CODE",
"timestamp": "2026-01-19T12:00:00.000Z"
}
3. ããªãã¼ã·ã§ã³
Zodã¹ãã¼ã
import { z } from 'zod';
const createUserSchema = z.object({
email: z.string().email('Invalid email'),
name: z.string().min(1, 'Name is required').max(100),
role: z.enum(['user', 'admin']).optional(),
});
// APIã«ã¼ãã§ä½¿ç¨
const validation = createUserSchema.safeParse(body);
if (!validation.success) {
return apiError('Invalid input', { status: 400 });
}
const { email, name, role } = validation.data;
å ±éã¹ãã¼ã
// UUID
const idSchema = z.string().uuid('Invalid ID format');
// ãã¼ã¸ãã¼ã·ã§ã³
const paginationSchema = z.object({
page: z.coerce.number().min(1).default(1),
limit: z.coerce.number().min(1).max(100).default(20),
});
4. Repository ãã¿ã¼ã³
åºæ¬æ§é
// lib/repositories/user.repository.ts
import { db } from '@/db';
import { users } from '@/db/schema';
import { eq } from 'drizzle-orm';
export interface CreateUserInput {
email: string;
name: string;
}
export const userRepository = {
async create(input: CreateUserInput) {
const [result] = await db.insert(users).values(input).returning();
return result;
},
async findById(id: string) {
const [result] = await db
.select()
.from(users)
.where(eq(users.id, id))
.limit(1);
return result ?? null;
},
async findByEmail(email: string) {
const [result] = await db
.select()
.from(users)
.where(eq(users.email, email))
.limit(1);
return result ?? null;
},
async update(id: string, input: Partial<CreateUserInput>) {
const [result] = await db
.update(users)
.set({ ...input, updatedAt: new Date() })
.where(eq(users.id, id))
.returning();
return result;
},
async delete(id: string) {
await db.delete(users).where(eq(users.id, id));
},
};
5. ã¨ã©ã¼ãã³ããªã³ã°
export const POST = withAuth(async ({ userId, request }) => {
try {
const body = await request.json();
const result = await repository.create(body);
return apiSuccess({ result });
} catch (error) {
console.error('[API] Error:', error);
if (error instanceof z.ZodError) {
return apiError('Validation failed', { status: 400 });
}
if (error instanceof Error && error.message.includes('unique')) {
return apiError('Already exists', { status: 409 });
}
return apiError('Internal server error', { status: 500 });
}
});
6. ãã§ãã¯ãªã¹ã
æ°ããAPIã«ã¼ã使æ:
- èªè¨¼ããã«ã¦ã§ã¢é©ç¨
- ãªã¯ã¨ã¹ãããªãã¼ã·ã§ã³ï¼Zodï¼
- çµ±ä¸ã¬ã¹ãã³ã¹å½¢å¼ä½¿ç¨
- ã¨ã©ã¼ãã³ããªã³ã°ï¼try-catchï¼
- èªå¯ãã§ãã¯ï¼ãªã½ã¼ã¹ææè 確èªï¼
- ãã°åºå
7. ã¢ã³ããã¿ã¼ã³
// â èªè¨¼ãªã
export async function GET(request: Request) {
const data = await db.select().from(users);
return Response.json(data);
}
// â ããªãã¼ã·ã§ã³ãªã
const { email } = await request.json();
await db.insert(users).values({ email });
// â ã¨ã©ã¼æ¡ãã¤ã¶ã
try {
await riskyOperation();
} catch (e) {
// ä½ãããªã
}