koa框架16 基础数据GET、POST、文件上传
GET数据
get的数据相对来时很简单,直接从ctx的query属性里面就可以直接获取到对应的数据
router.get("/",async ctx=>{
console.log(crx.query);
});
POST数据
post 相对来说难一点,我们需要使用一个中间件帮助我们获取数据
安装:koa-better-body
npm i koa-better-body
由于这个插件使用的是generator,koa会提示这个不推荐的报错,所以我们还需要一个koa的转换插件:koa-convert
npm i koa-convert
我们需要在激活body时 ,用convert方法包裹body方法,这样就可以转换成async的方式。
const Koa = require("koa");
const static = require("koa-static");
const body = require("koa-better-body");
const convert = require("koa-convert");
const Router = require("koa-router");
const server = new Koa();
server.listen(8080);
//post数据中间件
server.use(convert(body()));
const test = new Router();
test.post('/', async ctx => {
console.log(ctx.request.fields)
})
server.use(test.routes());
server.use(static("./static", {
maxage: 30 * 24 * 60 * 60 * 1000, //30天缓存周期
index: "index.html" //默认文件
}))
server.use(convert(body()));
方式注册中间件,用convert转换body方法。
数据自然要使用koa封装的对象,加上是用户提交的,所以是request对象,body会在这个对象上添加一个属性fields,他是一个object对象。
假设我们post提交一段数据,会返回如下
[Object: null prototype] { user: '大大' }
是一个以form的name为key,值为value的键值对对象
这是文本post,如果是文件呢?
form表单如下
<form action="/" method="post" enctype="multipart/form-data">
<input type="text" name="user" id=""><br /><br />
<input type="file" name="files"><br /><br />
<button type="submit">提交</button>
</form>
我们post提交可以得到如下对象:
{
user: '大大',
files: [
File {
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
size: 586,
path: 'C:\\Users\\13219\\AppData\\Local\\Temp\\upload_a0d4ff821b4d3867cf339656deba916a',
name: 'server2.js',
type: 'text/javascript',
hash: null,
lastModifiedDate: 2020 - 08 - 17 T13: 21: 42.551 Z,
_writeStream: [WriteStream],
[Symbol(kCapture)]: false
}
]
}
文本依旧键值对,而files是一个数组,因为我们传递多个文件,所以是个数组,数组里面有几个常用的属性:
- size 文件大小byte(字节)
- name koa的name是带文件格式后缀的,这个比express就方便很多了
- lastModifiedDate 最后修改日期
- path 文件路径
上传文件存哪
有了文件信息,我们其实还需要指定存放用户上传文件的路径,body方法有一个参数,也就是说,body方法支持传入一个键值对对象作为参数。
server.use(convert(body({
uploadDir: xxx路径
})));
由于这个路径可能会随着这个保存的js文件位置发生变化而变化,比如我把这个body作为一个模块打包,然后再引入,如果我们使用./
这种相对路径,可能位置就不对了。
我们可以利用path这个node的原生模块来生成一个相对于项目根目录的一个路径。
const Koa = require("koa");
const static = require("koa-static");
const body = require("koa-better-body");
const convert = require("koa-convert");
const Router = require("koa-router");
const path = require("path");
const server = new Koa();
server.listen(8080);
//post数据中间件
server.use(convert(body({
uploadDir: path.resolve(__dirname, "upload"),
})));
const test = new Router();
test.post('/', async ctx => {
console.log(ctx.request.fields)
})
server.use(test.routes());
server.use(static("./static", {
// maxage: 30 * 24 * 60 * 60 * 1000, //30天缓存周期
index: "index.html" //默认文件
}))
path.resolve()
是一个拼接地址的方法,而__dirname
关键词是一个node的独有值,他表示项目根目录,并且是一个动态的,比如你丢到子目录里面,他会自动调整,反正最后路径一定是根目录
第二个参数为你要拼接的目录名,这里我们让他保存在根目录下的upload目录中。
最后,我们提交的文件会自动存储在根目录下的upload文件夹下,并且文件名是由upload_uuid组成,并且也不会有后缀格式。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据