我转过几个弯 绕过那个小雨楼
拿着蒲扇摆着衣衫渡着紧箍咒
不问天涯不停留 喝过几壶酒
不过年少白头道义放胸口
倘若明天之后 遥看前尘剑封侯
似那天上神仙无所求
朝朝暮暮君如梦醒十分不为何理由
是真是假是惶恐是无休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
又过了几个弯 算尽天量道莫慌
踏这田园闻这芳草香
跌跌撞撞仗剑天涯折煞不枉无笔良
是梦是幻是温柔是家乡
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
谁能与我一醉方休
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组成,并且也不会有后缀格式。
评论(0)