Eggjs框架结构
路由
Router 主要用来描述请求 URL 和 Controller 的对应关系, 框架的 app/router.js
文件统一管理路由规则。
// app/router.ts
import {
Application } from 'egg';
// 定义 URL 路由规则
export default (app: Application) => {
const {
controller, router } = app;
// router 格式
// router.verb('router-name', 'path-match', middleware1, ..., middlewareN, app.controller.action);
// verb 指定 HTTP方法,如 GET、PUT、POST...对应get、put、post...
// router-name 设置路由别名,通过 Helper 辅助函数 pathFor 和 urlFor生成 URL。(可选)
// path-match 路由的 URL 路径
// middleware 配置中间件,可以多个
// controller 指定路由映射的 controller,可以有多个,串联执行
router.get('/', controller.home.index);
// 快速生成 CRUD 路由结构。
router.resources('posts', '/api/posts', controller.posts);
};
注意: Controller 必须定义在 app/controller
目录中。
参数获取
Query String 方式
// app/router.ts
router.get('/search', controller.search.index);
// app/controller/search.ts
public async index() {
const {
ctx } = this;
ctx.body = `search: ${
ctx.query.name}`; // 打印 search: egg
}
// 请求 http://127.0.0.1:7001/search?name=egg
参数命名方式
// app/router.ts
router.get('/user/:id/:name', controller.user.info);
// app/controller/user.ts
public async info() {
const {
ctx } = this;
ctx.body = `user: ${
ctx.params.id}, ${
ctx.params.name}`; // user: 123, xiaoming
};
// curl http://127.0.0.1:7001/user/123/xiaoming
复杂参数的获取
// app/router.ts
router.get(/^\/package\/([\w-.]+\/[\w-.]+)$/, controller.package.detail);
// app/controller/package.ts
public async detail() => {
// 按照下面的用户请求,`ctx.params[0]` 的 内容就是 `egg/1.0.0`
ctx.body = `package:${
ctx.params[0]}`;
};
// curl http://127.0.0.1:7001/package/egg/1.0.0
Controller
Controller 负责解析用户的输入,处理后返回相应的结果。所有的 Controller 文件都必须放在 app/controller
目录下,可以支持多级目录,访问的时候可以通过目录名级联访问。
推荐通过定义 Controller 类的方式来编写代码:
// app/controller/post.ts
import {
Controller } from 'egg';
export default class PostController extends Controller {
async create() {
const {
ctx, service } = this;
const createRule = {
title: {
type: 'string' },
content: {
type: 'string' },
};
// 校验参数
ctx.validate(createRule);
// 组装参数
const author = ctx.session.userId;
const req = Object.assign(ctx.request.body, {
author });
// 调用 Service 进行业务处理
const res = await