$ loading_
为 Node.js、Express 与 Next.js API 提供后端架构、接口设计与性能优化指导。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "backend-patterns" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/skills/backend-patterns/SKILL.md 2. 保存为 ~/.claude/skills/backend-patterns/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为一个使用 Node.js 和 Express 的电商后端设计可扩展架构,包含路由分层、控制器、服务层、数据库访问层、鉴权、中间件和错误处理,并说明每层职责。
一份清晰的后端分层架构方案,附带模块职责说明与最佳实践建议。
我有一个 Next.js API route,查询订单列表很慢。请帮我分析常见瓶颈,并给出数据库索引、分页、缓存、N+1 查询避免和响应结构优化建议。
针对慢查询与接口延迟的诊断思路,以及可执行的性能优化清单。
请为团队整理一份 Node.js 后端最佳实践清单,涵盖项目结构、环境变量管理、日志、异常处理、输入校验、安全、测试和部署注意事项。
一份适合团队落地执行的后端开发规范与检查清单。
Ölçeklenebilir sunucu tarafı uygulamalar için backend mimari kalıpları ve en iyi uygulamalar.
// PASS: Kaynak tabanlı URL'ler
GET /api/markets # Kaynakları listele
GET /api/markets/:id # Tek kaynak getir
POST /api/markets # Kaynak oluştur
PUT /api/markets/:id # Kaynağı değiştir (tam)
PATCH /api/markets/:id # Kaynağı güncelle (kısmi)
DELETE /api/markets/:id # Kaynağı sil
// PASS: Filtreleme, sıralama, sayfalama için query parametreleri
GET /api/markets?status=active&sort=volume&limit=20&offset=0
// Veri erişim mantığını soyutla
interface MarketRepository {
findAll(filters?: MarketFilters): Promise<Market[]>
findById(id: string): Promise<Market | null>
create(data: CreateMarketDto): Promise<Market>
update(id: string, data: UpdateMarketDto): Promise<Market>
delete(id: string): Promise<void>
}
class SupabaseMarketRepository implements MarketRepository {
async findAll(filters?: MarketFilters): Promise<Market[]> {
let query = supabase.from('markets').select('*')
if (filters?.status) {
query = query.eq('status', filters.status)
}
if (filters?.limit) {
query = query.limit(filters.limit)
}
const { data, error } = await query
if (error) throw new Error(error.message)
return data
}
// Diğer metodlar...
}
// İş mantığı veri erişiminden ayrılmış
class MarketService {
constructor(private marketRepo: MarketRepository) {}
async searchMarkets(query: string, limit: number = 10): Promise<Market[]> {
// İş mantığı
const embedding = await generateEmbedding(query)
const results = await this.vectorSearch(embedding, limit)
// Tam veriyi getir
const markets = await this.marketRepo.findByIds(results.map(r => r.id))
// Benzerliğe göre sırala
return markets.sort((a, b) => {
const scoreA = results.find(r => r.id === a.id)?.score || 0
const scoreB = results.find(r => r.id === b.id)?.score || 0
return scoreA - scoreB
})
}
private async vectorSearch(embedding: number[], limit: number) {
// Vector arama implementasyonu
}
}
// Request/response işleme hattı
export function withAuth(handler: NextApiHandler): NextApiHandler {
return async (req, res) => {
const token = req.headers.authorization?.replace('Bearer ', '')
if (!token) {
return res.status(401).json({ error: 'Unauthorized' })
}
try {
const user = await verifyToken(token)
req.user = user
return handler(req, res)
} catch (error) {
return res.status(401).json({ error: 'Invalid token' })
}
}
}
// Kullanım
export default withAuth(async (req, res) => {
// Handler req.user'a erişebilir
})
// PASS: İYİ: Sadece gerekli sütunları seç
const { data } = await supabase
.from('markets')
.select('id, name, status, volume')
.eq('status', 'active')
.order('volume', { ascending: false })
.limit(10)
// FAIL: KÖTÜ: Her şeyi seç
const { data } = await supabase
.from('markets')
.select('*')
// FAIL: KÖTÜ: N+1 sorgu problemi
const markets = await getMarkets()
for (const market of markets) {
market.creator = await getUser(market.creator_id) // N sorgu
…
通过双评审智能体对结果进行对抗式校验,提升输出发布前的可靠性
帮助开发者梳理后端架构模式、API设计与数据库优化最佳实践