skills/nodejs-skills/koa/SKILL.md
Provides comprehensive guidance for Koa.js framework including middleware composition, context API, async/await patterns, and application structure. Use when the user asks about Koa, needs to create lightweight Node.js web applications, implement middleware, or build APIs with Koa.
npx skillsauth add teachingai/agent-skills koaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill whenever the user wants to:
ctx and next patterns@koa/router for route definitionsconst Koa = require('koa');
const Router = require('@koa/router');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
const router = new Router();
// Error handling middleware (top of stack)
app.use(async (ctx, next) => {
try {
await next();
} catch (err) {
ctx.status = err.status || 500;
ctx.body = { error: err.message };
ctx.app.emit('error', err, ctx);
}
});
// Body parser
app.use(bodyParser());
// Routes
router.get('/api/items', async (ctx) => {
const items = await Item.findAll();
ctx.body = { items };
});
router.post('/api/items', async (ctx) => {
const { name, price } = ctx.request.body;
const item = await Item.create({ name, price });
ctx.status = 201;
ctx.body = item;
});
router.get('/api/items/:id', async (ctx) => {
const item = await Item.findById(ctx.params.id);
if (!item) {
ctx.throw(404, 'Item not found');
}
ctx.body = item;
});
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000, () => console.log('Server running on port 3000'));
// Logging middleware — demonstrates onion execution order
app.use(async (ctx, next) => {
const start = Date.now();
await next(); // <-- downstream
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`);
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
// Authentication middleware
function requireAuth() {
return async (ctx, next) => {
const token = ctx.get('Authorization')?.replace('Bearer ', '');
if (!token) {
ctx.throw(401, 'Authentication required');
}
ctx.state.user = await verifyToken(token);
await next();
};
}
router.get('/api/profile', requireAuth(), async (ctx) => {
ctx.body = ctx.state.user;
});
async/await correctly with next() — always await next() in middlewarectx.throw() for HTTP errors; listen to app.on('error') for logging@koa/cors for CORS configuration; keep middleware chain leankoa, Node.js, middleware, onion model, async/await, context, routing, REST API
development
Guidance for Next.js using the official docs at nextjs.org/docs. Use when the user needs Next.js concepts, configuration, routing, data fetching, or API reference details.
tools
Provides comprehensive guidance for Flask framework including routing, templates, forms, database integration, extensions, and deployment. Use when the user asks about Flask, needs to create web applications, implement routes, or build Python web services.
development
Provides comprehensive guidance for FastAPI framework including routing, request validation, dependency injection, async operations, OpenAPI documentation, and database integration. Use when the user asks about FastAPI, needs to create REST APIs, or build high-performance Python web services.
development
Provides comprehensive guidance for Django framework including models, views, templates, forms, admin, REST framework, and deployment. Use when the user asks about Django, needs to create web applications, implement models and views, or build Django REST APIs.