koa-router get请求获取query参数

目录

get请求获取query参数


实现方式:

request.query                      query对象

request.querystring             query 字符串

例如: http://localhost:3000/news?a=36&b=37

request.query                      {a:36,b:37}

request.querystring             'a=36&b=37'

案例:

启用下面服务访问该url:http://localhost:3000/news?a=36&b=37

/**
 * Koa
 * */
const Koa = require('koa');
const Router = require('koa-router')();
const App = new Koa();

Router.get('/',(ctx,next)=>{
    ctx.body = 'Hello koa';
});
Router.get('/news',(ctx,next)=>{
   let url = ctx.url;
   let request = ctx.request;
   let req_query = request.query;
   let req_querystring = request.querystring;

   let ctx_query = ctx.query;
   let ctx_querystring = ctx.querystring;
   ctx.body = {
       url,
       req_query,
       req_querystring,
       ctx_query,
       ctx_querystring
   }
});

App.use(Router.routes());
App.use(Router.allowedMethods());
App.listen(3000,()=>{
    console.log('quick start at port 3000');
});

结果:

{"url":"/news?a=36&b=37","req_query":{"a":"36","b":"37"},"req_querystring":"a=36&b=37","ctx_query":{"a":"36","b":"37"},"ctx_querystring":"a=36&b=37"}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现检验参数、默认值、白名单和是否允许为空等功能,你可以在koa-parameter的基础上,进一步封装一个参数校验函数,用来统一处理这些需求,并且使其支持每个一级路由之间的差异。 首先,你可以定义一个参数校验函数validate,它接收三个参数routeRules、globalRules和options。其中,routeRules是当前路由需要校验的参数规则,globalRules是全局的参数规则,options是一些附加选项,如默认值、白名单、是否允许为空等。 ```javascript const validate = (routeRules, globalRules, options) => { return async (ctx, next) => { const rules = Object.assign({}, globalRules, routeRules); const { body, query, params } = ctx.request; // 获取所有参数并校验 const data = Object.assign({}, body, query, params); try { ctx.verifyParams(data, rules); } catch (err) { ctx.throw(400, err.errors[0].field + ' ' + err.errors[0].message); } // 处理默认值 if (options.defaults) { for (const key in options.defaults) { if (data[key] === undefined) { data[key] = options.defaults[key]; } } } // 处理白名单 if (options.whitelist) { for (const key in data) { if (!options.whitelist.includes(key)) { delete data[key]; } } } // 处理是否允许为空 if (options.allowEmpty) { for (const key in rules) { if (!data.hasOwnProperty(key) && !rules[key].required) { data[key] = null; } } } // 将处理后的参数存入ctx.state中,方便后续使用 ctx.state.data = data; await next(); }; }; ``` 在validate函数中,我们首先将全局参数规则和当前路由的参数规则合并为一个rules对象。然后,我们从request中获取所有参数,并使用koa-parameter的verifyParams方法进行校验。如果校验不通过,我们仍然使用ctx.throw()方法抛出一个400错误。 接着,我们根据options中的配置,依次处理默认值、白名单和是否允许为空。 最后,我们将处理后的参数保存在ctx.state.data中,方便后续使用。 使用上面的validate函数时,你可以在每个一级路由中单独定义参数校验规则、默认值、白名单和是否允许为空等。例如: ```javascript const Koa = require('koa'); const Router = require('koa-router'); const parameter = require('koa-parameter'); const app = new Koa(); const router = new Router(); // 引入参数校验中间件 app.use(parameter(app)); // 定义全局参数规则 const globalRules = { name: { type: 'string', required: true }, age: { type: 'number', required: true } }; // 在路由中使用参数校验 router.post('/api/user', validate({ email: { type: 'email' } }, globalRules, { defaults: { age: 18 }, whitelist: ['name', 'email'], allowEmpty: true }), async (ctx, next) => { const { data } = ctx.state; // 处理请求 }); router.get('/api/user/:id', validate({}, globalRules, { defaults: { age: 18 }, whitelist: ['id', 'name'], allowEmpty: false }), async (ctx, next) => { const { data } = ctx.state; // 处理请求 }); // 启动应用 app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => { console.log('Server is running at http://localhost:3000'); }); ``` 在上面的例子中,我们首先定义了全局的参数规则globalRules,然后在每个路由中使用validate函数进行参数校验。在每个validate函数中,我们分别定义了当前路由的参数规则routeRules、默认值、白名单和是否允许为空等选项。 通过这种方式,你可以在每个一级路由中单独定义参数校验规则、默认值、白名单和是否允许为空等,不同的路由之间不会互相干扰。同时,你还可以使用全局参数规则globalRules,来统一管理一些公共的参数规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值