encore-service
56
总安装量
56
周安装量
#3872
全站排名
安装命令
npx skills add https://github.com/encoredev/skills --skill encore-service
Agent 安装分布
claude-code
38
codex
32
cursor
30
gemini-cli
29
github-copilot
25
Skill 文档
Encore Service Structure
Instructions
Creating a Service
Every Encore service needs an encore.service.ts file:
// encore.service.ts
import { Service } from "encore.dev/service";
export default new Service("my-service");
Minimal Service Structure
my-service/
âââ encore.service.ts # Service definition (required)
âââ api.ts # API endpoints
âââ db.ts # Database (if needed)
Application Patterns
Single Service (Recommended Start)
Best for new projects – start simple, split later if needed:
my-app/
âââ package.json
âââ encore.app
âââ encore.service.ts
âââ api.ts
âââ db.ts
âââ migrations/
âââ 001_initial.up.sql
Multi-Service
For distributed systems with clear domain boundaries:
my-app/
âââ encore.app
âââ package.json
âââ user/
â âââ encore.service.ts
â âââ api.ts
â âââ db.ts
âââ order/
â âââ encore.service.ts
â âââ api.ts
â âââ db.ts
âââ notification/
âââ encore.service.ts
âââ api.ts
Large Application (System-based)
Group related services into systems:
my-app/
âââ encore.app
âââ commerce/
â âââ order/
â â âââ encore.service.ts
â âââ cart/
â â âââ encore.service.ts
â âââ payment/
â âââ encore.service.ts
âââ identity/
â âââ user/
â â âââ encore.service.ts
â âââ auth/
â âââ encore.service.ts
âââ comms/
âââ email/
â âââ encore.service.ts
âââ push/
âââ encore.service.ts
Service-to-Service Calls
Import other services from ~encore/clients:
import { user } from "~encore/clients";
export const getOrderWithUser = api(
{ method: "GET", path: "/orders/:id", expose: true },
async ({ id }): Promise<OrderWithUser> => {
const order = await getOrder(id);
const orderUser = await user.get({ id: order.userId });
return { ...order, user: orderUser };
}
);
When to Split Services
Split when you have:
| Signal | Action |
|---|---|
| Different scaling needs | Split (e.g., auth vs analytics) |
| Different deployment cycles | Split |
| Clear domain boundaries | Split |
| Shared database tables | Keep together |
| Tightly coupled logic | Keep together |
| Just organizing code | Use folders, not services |
Service with Middleware
import { Service } from "encore.dev/service";
import { middleware } from "encore.dev/api";
const loggingMiddleware = middleware(
{ target: { all: true } },
async (req, next) => {
console.log(`Request: ${req.requestMeta?.path}`);
return next(req);
}
);
export default new Service("my-service", {
middlewares: [loggingMiddleware],
});
Guidelines
- Services cannot be nested within other services
- Start with one service, split when there’s a clear reason
- Use
~encore/clientsfor cross-service calls (never direct imports) - Each service can have its own database
- Service names should be lowercase, descriptive
- Don’t create services just for code organization – use folders instead