Eggjs学习系列(二) 爬虫项目实战

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
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值