今天发现了一个线上问题,我们的APP跳转内嵌H5时会默认query带一些参数,比如city之类的,但是有时运营人员配置页面链接地址时在不太了解的情况下,会手动加上city这些参数,恰巧你请求接口的时候需要这个参数,使用this.$route.query.city获取,form提交就会成为下图,会报400参数不规范,

这样重复query传参数显然是不规范的,这样使用this.$route.query.city获取回来是一个数组

解决该问题需要两点:

  1. 根源上配置的时候不要重复配置
  2. 前端对URLquery传参进行过滤

那么过滤参数怎样才能一劳永逸呢,避免每次取参数时判断是不是数组这中重复的代码。我们使用nuxt 这中服务端渲染的框架,开始想当然的想到在middleware中过滤,每次请求过来后执行middleware,过滤参数

先写个filterQuery的测试middleware 测试覆盖原来city,跑起来看看效果吧

控制台打印结果没啥问题

在页面里取一下试试,但结果不尽人意,this.$route.query.city 依然是数组多个值

看到这里,才发现自己太想当然了,nuxt是一套vue ssr的架构,服务端渲染的项目,**每当一个新路由过来时,都会创建一个新的vue 实例,包括router, store,**这样是为了避免交叉请求状态的污染,页面中vue生命周期里this.$routevue实例上的;改动middlewareroute只在服务端比如asyncDatafetch时获取生效

测试一下 页面中asyncData获取一下参数

果然这里变了

那现在就是对routerquery做处理,其实vue-router为我们提供这样的函数 parseQuery/stringQuery(提供自定义查询字符串的解析/反解析函数。覆盖默认行为)

nuxt是对vue进行了封装,路由生成都是自动通过扫页面路径自动生成的,那我们去nuxt的源码里探个究竟,生成的核心是一个模板文件,lib/app/router.js文件,创建新router实例的工厂函数也在这个文件里

export function createRouter () {return new Router({mode: '<%= router.mode %>',base: '<%= router.base %>',linkActiveClass: '<%= router.linkActiveClass %>',linkExactActiveClass: '<%= router.linkExactActiveClass %>',scrollBehavior,routes: [
<%= _routes %>],<% if (router.parseQuery) { %>parseQuery: <%= serialize(router.parseQuery).replace('parseQuery(', 'function(') %>,<% } %><% if (router.stringifyQuery) { %>stringifyQuery: <%= serialize(router.stringifyQuery).replace('stringifyQuery(', 'function(') %>,<% } %>fallback: <%= router.fallback %>})
}
复制代码

在这里找到了需要的parseQuery 函数,这里的router.parseQuery是在 lib/common/options.js中配置的

router: {mode: 'history',base: '/',routes: [],middleware: [],linkActiveClass: 'nuxt-link-active',linkExactActiveClass: 'nuxt-link-exact-active',extendRoutes: null,scrollBehavior: null,parseQuery: false,stringifyQuery: false,fallback: false},
复制代码

无论本地启动还是nuxt build的时候这个options.js都会与根目录下的nuxt.config.js配置项进行合并,所以也就一目了然了,加到nuxt.config.jsrouter下就好了,明确了就开干试试吧

nuxt.config.js加了如下代码

parseQuery: function (querystring) {let d = function (str) {try {return str && window.decodeURIComponent(str)} catch (e) {return str}}if (d(querystring).includes('?')) querystring = d(querystring).replace(/\?/g, '&')querystring = querystring.split('&')let params = {}let pair// march and parsefor (let i = querystring.length - 1; i >= 0; i--) {pair = querystring[i].split('=')params[d(pair[0])] = d(pair[1])}return params}
复制代码

不仅对重复的key过滤,也对url混入多个?做了合并过滤 结果就是 this.$router.query.city 进行了过滤,这里默认取第一个值

~本文完,有任何表述不清或者表达错误的,请大家指正~

转载于:https://juejin.im/post/5bae00116fb9a05d2469cb73

nuxt 过滤 query 参数相关推荐

  1. oracle exp导出表where,oracle EXP导出一张表时使用query参数指定where条件

    oracle exp 导出一个表的部分内容,使用query参数可加上SQL的where条件进行过滤 注意:如果需要使用到日期字符串格式等单引号,需要使用双引号将where条件括起来,而且双引号要用\做 ...

  2. exp/expdp中query参数的使用

    之前一直无法搞清楚exp/expdp中关于query参数的正确写法,每次都是零散的印象,这次特意把这个记录成日志以方便以后查看.关于query参数的写法请参看以下两个例子:    1.使用命令行:   ...

  3. oracle Expdp带条件,Oracle 11g expdp中query参数的使用

    Oracle 11g expdp中提供了query参数,可以在需要按条件导出表中部分数据时使用,它的使用就像是在select语句中的where条件使用一样. 数据库版本 linuxidc@ORCL&g ...

  4. 路由的query参数

    文章目录 Message组件发送query参数 Detail组件接收query参数 本例基于 路由的基本使用.嵌套路由的实现. 项目目录如下: 一般组件components/Banner.vue &l ...

  5. oracle11 exp query,EXP的QUERY参数

    QUERY 默认:none 当导出模式为表模式时,此参数可以选择这些表中的子集.query参数的相当于在select语句中增加了where条件.此条件应用于tables参数中的所有表.需要注意的是,q ...

  6. FastApi路径参数Query参数及参数类型

    前面讲述了FastApi的搭建与运行,这篇来讲下FastApi的路径参数与查询参数. 路径参数 可以使用与Python格式字符串相同的语法来声明路径参数 from fastapi import Fas ...

  7. oracle 导出数据expdp的query参数用法

    今天收到了一个数据同步的需求,具体信息是将原oracle数据库的几张表的部分数据同步到另外一台oracle数据库.完成这个需求使用的是oracle的expdp导出工具.因为是导出表的部分数据,因此用到 ...

  8. Vue路由params、query参数丢失解决

    在vue中路由传参有两种形式:1.params:2.query 解决办法:sessionStorage或者localStorage 两者的区别:localStorage是永久保存不清除一直存在,ses ...

  9. 强大的PHP防SQL注入类,可以过滤敏感参数

    这是一个考虑比较全面的php和sql结合的防注入程序,在php方便主要对get,post,cooke,files进行了过滤,在sql中我们就对delete,update一些查询命令进行检测过滤. SQ ...

最新文章

  1. 使用unix工具监控cpu、内存等系统资源占用率
  2. 分享一个超棒的响应式幻灯jQuery插件 - refineslide
  3. java mkfifo_在Java中创建命名管道
  4. ue的xml格式转换_VCARD格式
  5. 1、MyEclipse插件配置以及通过MyEclipse生成表对应的JPA代码
  6. 【对象程序设计面向】虚继承
  7. mysql 1556_mysql导入时Error Code: 1556 - You can't use locks with log tables.
  8. rabbitmq topic 收不到数据_RabbitMQ和Kafka到底怎么选?
  9. 封装直传阿里云存储文件上传控件
  10. 16.通过实现“函数一个返回值出口,返回两个返回值”。来了解指针与普通地址的区别...
  11. phpexcel 导出到xls文件的时候出现乱码解决
  12. msvcr100.dll不存在
  13. mybatis小结(1)
  14. (什么是 RPC?) AND(什么是域名?)AND (DMA是什么?)AND(IRQ是什么?) 选择自 ycool1984 的 Blog
  15. Vulkan 教程(1)开篇
  16. toLatin1 toLocal8Bit
  17. icp经营许可证怎么办?
  18. XDOJ综合题 数字统计排序
  19. 中兴换头;任正非表态中美差距还有 50 年;Google 回应隐私丑闻 | CSDN 极客头条...
  20. JAVA数字大写金额转换

热门文章

  1. How to enable mod_rewrite on Apache?
  2. bind98-内网智能DNS之master服务器构建
  3. JEECMS V3.0 常用标签使用说明
  4. 冇内容管理系统分析-[JS]详尽解析window.event对象
  5. 初涉网络实验-路由器端口的开启与配置
  6. 最新网络工程师考试大纲
  7. Java-ORM数据库框架CDM介绍
  8. Consumer is not subscribed to any topics
  9. linux进程间通信之Posix共享内存用法详解及代码举例
  10. REST 架构是什么