博客
关于我
egg:如何在控制器中拿到前端传的参数
阅读量:258 次
发布时间:2019-03-01

本文共 3145 字,大约阅读时间需要 10 分钟。

框架通过在 Controller 上绑定的 Context 实例,提供了许多便捷方法和属性获取用户通过 HTTP 请求发送过来的参数。

query(get)

获取 url 的 ?后面的数据,通过 ctx.query 拿到数据:

// GET /posts?category=egg&language=nodeclass PostController extends Controller {     async listPosts() {       const query = this.ctx.query;    // {       //   category: 'egg',    //   language: 'node',    // }  }}

Router params(get)

获取 Router 上也可以申明参数,通过 ctx.params 拿到数据:

// app.get('/projects/:projectId/app/:appId', 'app.listApp');// GET /projects/1/app/2class AppController extends Controller {     async listApp() {     	// assert.equal 相当于 ==    assert.equal(this.ctx.params.projectId, '1');    assert.equal(this.ctx.params.appId, '2');    // 或用解构赋值    const {    projectId, appId } = this.ctx.params  }}

body(post)

也就是 post、put、delete 等方法,框架内置了 bodyParser 中间件来对这两类格式的请求 body 解析成 object 挂载到 ctx.request.body 上。

// POST /api/posts HTTP/1.1// Host: localhost:3000// Content-Type: application/json; charset=UTF-8//// {"title": "controller", "content": "what is controller"}class PostController extends Controller {     async listPosts() {       assert.equal(this.ctx.request.body.title, 'controller');    assert.equal(this.ctx.request.body.content, 'what is controller');  }}

可以在 config/config.default.js 配置解析请求的大小,会覆盖框架默认值 100kb:

module.exports = {     bodyParser: {       jsonLimit: '1mb',    formLimit: '1mb',  },};

注意区分:ctx.request.body 和 ctx.body :

ctx.body 是 ctx.response.body 的简写。

egg的file模式

1、在 config 文件中启用 file 模式:

// config/config.default.jsexports.multipart = {     mode: 'file',};

2、上传 / 接收文件:

前端:

title:
file:

后端:

// app/controller/upload.jsconst Controller = require('egg').Controller;const fs = require('mz/fs');module.exports = class extends Controller {     async upload() {       const {    ctx } = this;    const file = ctx.request.files[0];    const name = 'egg-multipart-test/' + path.basename(file.filename);    let result;    try {         // 处理文件,比如上传到云端      result = await ctx.oss.put(name, file.filepath);    } finally {         // 需要删除临时文件      await fs.unlink(file.filepath);    }    ctx.body = {         url: result.url,      // 获取所有的字段值      requestBody: ctx.request.body,    };  }};

上传多个文件可以看 egg 官网

stream模式获取file

const path = require('path');const sendToWormhole = require('stream-wormhole');const Controller = require('egg').Controller;class UploaderController extends Controller {     async upload() {       const ctx = this.ctx;    const stream = await ctx.getFileStream();    const name = 'egg-multipart-test/' + path.basename(stream.filename);    // 文件处理,上传到云存储等等    let result;    try {         result = await ctx.oss.put(name, stream);    } catch (err) {         // 必须将上传的文件流消费掉,要不然浏览器响应会卡死      await sendToWormhole(stream);      throw err;    }    ctx.body = {         url: result.url,      // 所有表单字段都能通过 `stream.fields` 获取到      fields: stream.fields,    };  }}module.exports = UploaderController;

通过 ctx.getFileStream 获取文件的前提:

  1. 只支持上传一个文件。
  2. 上传文件必须在所有其他的 fields 后面,否则在拿到文件流时可能还获取不到 fields。

stream 模式上传多个文件使用 ctx.multipart()

获取header值

  1. ctx.headersctx.headerctx.request.headersctx.request.header 等价
  2. ctx.get(name)ctx.request.get(name) 获取 header 某一个字段

转载地址:http://nopo.baihongyu.com/

你可能感兴趣的文章
MySQL报错记录一下10061或者非自己的IP
查看>>
純前端 - 各種實現進度條
查看>>
Java 設計模式 - 建造者模式
查看>>
ES6 JavaScript 重新認識 Promise
查看>>
前端優化 - 防抖與節流
查看>>
Spring--04--AOP增强
查看>>
2020-07-16:如何获得一个链表的倒数第n个元素?
查看>>
2020-11-04:java里,总体说一下集合框架。
查看>>
2020-12-04:mysql 表中允许有多少个 TRIGGERS?
查看>>
2020-12-10:i++是原子操作吗?为什么?
查看>>
2021-01-12:多维快查多维查询系统,你了解的解决方案都有哪些?
查看>>
2021-01-17:java中,HashMap底层数据结构是什么?
查看>>
2021-01-21:java中,HashMap的读流程是什么?
查看>>
Imagination官方信息速递2021年光线追踪专刊
查看>>
计算机视觉中的双目立体视觉和体积度量
查看>>
什么是数据中心,它们是如何变化的?
查看>>
516. Longest Palindromic Subsequence
查看>>
Linux系统基础
查看>>
运维相关的命令
查看>>
java第四话:数组知识点讲解
查看>>