success(data, msg)fail(code, msg)reqresnextctxreq.idctx.state.traceId// controllers/BaseController.js
class BaseController {
constructor(ctx) {
this.ctx = ctx;
this.logger = ctx.logger || console;
}
success(data = null, msg = 'OK') {
this.ctx.status = 200;
this.ctx.body = { code: 0, msg, data };
}
fail(code = 500, msg = 'Server Error', data = null) {
this.ctx.status = code;
this.ctx.body = { code, msg, data };
}
// 可被子类覆盖的钩子
async beforeAction() {}
async afterAction() {}
}
module.exports = BaseController;
// controllers/UserController.js
const BaseController = require('./BaseController');
class UserController extends BaseController {
constructor(ctx) {
super(ctx); // 必须调用,确保 this.ctx 正确初始化
}
async list() {
await this.beforeAction();
try {
const users = await db.query('SELECT * FROM users');
this.success(users);
} catch (err) {
this.fail(500, 'Query failed');
this.logger.error(err);
} finally {
await this.afterAction();
}
}
async create() {
const { name, email } = this.ctx.request.body;
if (!name || !email) return this.fail(400, 'Missing required fields');
// ... 业务逻辑
}
}
module.exports = UserController;
const UserController = require('./controllers/UserController');
router.get('/users', async (req, res, next) => {
const ctrl = new UserController({ req, res, next, logger: req.app.logger });
await ctrl.list();
});
router.post('/users', async (req, res, next) => {
const ctrl = new UserController({ req, res, next, logger: req.app.logger });
await ctrl.create();
});
ctxrouter.get('/users', async (ctx) => {
const ctrl = new UserController(ctx);
await ctrl.list();
});util.inheritsthis.loggerconstructorParent.call(this, ...)super.xxx()util.inherits