Koa2项目中接收参数
一 实现跨域访问
1.如果希望开发的API被前端项目调用(例如Vue),则,第一步必然是实现跨域,Koa2框架中实现跨域访问与Express中略有不同,需要安装koa2-cors中间件,借助koa2-cors来实现跨域
npm install koa2-cors -save
安装完成之后在app.js文件中引入,并配置相关内容
const cors = require('koa2-cors');
app.use(
cors({
origin: function(ctx) { //设置允许来自指定域名请求
if (ctx.url === '/test') {
return '*'; // 允许来自所有域名请求
}
return 'http://localhost:8080'; //只允许http://localhost:8080这个域名的请求
//return '*'; // 允许来自所有域名请求
},
maxAge: 5, //指定本次预检请求的有效期,单位为秒。
credentials: true, //是否允许发送Cookie
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法'
allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] //设置获取其他自定义字段
})
);
以上是基础配置,通过origin函数,可实现仅允许指定域名访问API,更多参数及配置请参考koa2-cors。
二 自定义一个API接口
1.我们在routes文件夹下创建一个test.js文件,参考项目给出的实例,写入如下内容
const router = require('koa-router')()
router.prefix('/test') //定义路由名称
//定义一个默认的Get API
router.get('/', function (ctx, next) {
ctx.body = '这是test.js的默认接口!'
})
module.exports = router
2.参考框架给出的默认示例,在app.js中使用这个test.js路由文件
const test= require('./routes/test')
app.use(test.routes(), test.allowedMethods())
此处的用法与Express框架的用法区别不大,不难理解,不过需要注意的是,路由名称是在test.js路由文件中。
如果调用的话,则可以访问 http://localhost:3000/test,以上步骤没错的话,则会出现一下内容。
从以上的简单实例中来看,ctx.body的值相当于Express框架中的res.send(),ctx被称之为上下文。当我们给ctx.body赋值,框架默认API执行结束且返回数据。那么当我们不给ctx.body赋值时会怎么样?我们去掉赋值代码看看。
router.get('/', function (ctx, next) {
// 注释调ctx.body
// ctx.body = '这是test.js的默认接口!'
})
访问接口http://localhost:3000/test,
再来看看终端控制台给出的日志内容。
终端控制台直接给出了404,这表示什么不需要我再多说了。
三 接受Get参数
1.通过以上实例,我们已经简单了解到怎么返回一些数据,下面来添加一个带有参数的GetAPI,来看看怎么获取Get请求传递的参数。
router.get('/getinfo', function (ctx, next) {
console.log(ctx.query);
ctx.body = 'this is a users/bar response'
})
然后访问http://localhost:3000/test/getinfo?id=1&name=shawn
控制台输出的内容如下:
可以看到,ctx.query已经将Get请求的参数转换成了一个对象直接返回给了我们,我们直接接受然后使用即可。
2.再来看看Get请求中的param传值,将接口修改如下:
router.get('/getinfo/:id/:name', function (ctx, next) {
console.log(ctx.params);
ctx.body = 'this is a users/bar response'
})
再试着访问http://localhost:3000/test/getinfo/1/shawn
监控一下控制台输出的内容
我们使用ctx.params可以接受Get接口传递的param参数,请注意区分两种接口的定义方式。
四 接受Post参数
1.本地Post接口的测试模拟,我这边会使用一个测试工具:BB-API,方便进行测试。
2.编写一个Post请求接口:
router.post('/add', function (ctx, next) {
console.log(ctx.request.body); //使用ctx.request.body接收post请求传递的参数
ctx.body = ctx.request.body
})
BB-AP操作如下,使用Post方式访问http://localhost:3000/test/add接口
我们在终端控制台可以看到一下日志内容:
由此,我们知道,获取Post接口传递的参数,使用ctx.request.body即可。
总结
1.需要注意,当我们直接中输出ctx的值,是找不到以上所说的属性值的。
以上只是Koa2框架中Post/Get获取参数值的简单用法,更多详细的原理和用法请参考Koa2官方文档