[eggjs/egg]如何扩展ctx.redirect

2025-11-04 955 views
8

如题,我在控制器中使用ctx.redirct跳转时,如果url连接中有中文汉字就会报错,所以我想扩展ctx.redirect,处理一下url参数。各位大神,我应该怎么扩展?

回答

9

url 需要 encode

9

url 需要 encode

是的,但是我想扩展ctx.redirect,自动对所有的跳转链接进行url处理

5

你直接扩展一个 ctx.myRedirect 不就行了?

8

你直接扩展一个ctx.myRedirect不就行了?

是的,但是怎么扩展?我在extends/context.js 试了几次都没成功

2

提供最小可复现方式,或者看下文档。

目录是 app/extend/context.js 没有 s

7

提供最小可复现方式,或者看下文档。

目录是app/extend/context.js没有的

去掉S扩展成功了,但是现在出现了新问题 这是url参数拼接的代码 var quer = ctx.query; let $url = '/u/codeair?'; for (var i in quer){ if(quer[i]){ $url += i+'='+quer[i]+'&'; } } if(typeof quer.needinit =="undefined"){ $url +='needinit=1&'; } if(typeof quer.common =="undefined"){ $url +='common=0&'; } if(typeof quer.board =="undefined"){ $url +='board=Arduino&'; } ctx.redirect($url); 这是我扩展的redirect redirect(url){ if(/[\u3220-\uFA29]/.test(url)){ this[REDIRECT]=this.redirect(encodeURI(decodeURI(url))); } return this[REDIRECT]; } 现在是拼接成功,扩展url编码也成功了,但是增加的url参数没有在浏览器地址栏体现出来 输入地址:http://a.shinelab.cn:8000/u/codeair, 扩展控制台打印地址:/u/codeair?needinit=1&common=0&board=Arduino, 浏览器地址栏显示:

0

这是 HTTP 协议了,自己看下 network 排查下自己哪里错了。

话说,encodeURI(decodeURI(url) 是什么鬼

0

这是 HTTP 协议了,自己看下 network 排查下自己哪里错了。

话说,encodeURI(decodeURI(url) 是什么鬼

没找到啊,页面实际上是跳了的,但就是浏览器地址栏没变,这是请求的信息,求大神指点

8

提供最小可复现代码库再讨论。

8

提供最小可复现代码库再讨论。

这是我提取的项目,放在egg框架里就可以了 https://github.com/xcs-shadow/test.git

4

几个问题:

return ctx.redirect() 你少了 return。。。 你 context 里面的覆盖 redirect 的方式是错的,不要去覆盖内置的方法。 即使可以覆盖,你覆盖的方式也是错的。。。自己看下代码最后一行,返回一个函数是什么意思。
4

这才是正确的覆盖方式 (但我非常不建议覆盖内置的方法,这种做法就跟当年 mootools 直接覆盖 Object.toString 等内置原型方法一样,早已经被业界认定为不推荐的实践)。

module.exports ={
   redirect(...args){
      console.log(args);
      return this.response.redirect(...args);
  }
}

你之前的方式,最大的错误是,在一个 redirect 的方法里面, 返回的是一个函数体,而不是函数执行的结果。

module.exports ={
   redirect(...args){
      console.log(args);
      // 什么鬼
      return this[REDIRECT];
  }
}