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是一个数组,因为我们传递多个文件,所以是个数组,数组里面有几个常用的属性:

  1. size 文件大小byte(字节)
  2. name koa的name是带文件格式后缀的,这个比express就方便很多了
  3. lastModifiedDate 最后修改日期
  4. 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组成,并且也不会有后缀格式。

分类: Node 标签: getpostnodekoa文件上传

评论

暂无评论数据

暂无评论数据

目录