如题,我在控制器中使用ctx.redirct跳转时,如果url连接中有中文汉字就会报错,所以我想扩展ctx.redirect,处理一下url参数。各位大神,我应该怎么扩展?
[eggjs/egg]如何扩展ctx.redirect
回答
url 需要 encode
url 需要 encode
是的,但是我想扩展ctx.redirect,自动对所有的跳转链接进行url处理
你直接扩展一个 ctx.myRedirect 不就行了?
你直接扩展一个ctx.myRedirect不就行了?
是的,但是怎么扩展?我在extends/context.js 试了几次都没成功
提供最小可复现方式,或者看下文档。
目录是 app/extend/context.js 没有 s
提供最小可复现方式,或者看下文档。
目录是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,
浏览器地址栏显示:
这是 HTTP 协议了,自己看下 network 排查下自己哪里错了。
话说,encodeURI(decodeURI(url) 是什么鬼
这是 HTTP 协议了,自己看下 network 排查下自己哪里错了。
话说,encodeURI(decodeURI(url) 是什么鬼
没找到啊,页面实际上是跳了的,但就是浏览器地址栏没变,这是请求的信息,求大神指点
提供最小可复现代码库再讨论。
提供最小可复现代码库再讨论。
这是我提取的项目,放在egg框架里就可以了 https://github.com/xcs-shadow/test.git
几个问题:
return ctx.redirect() 你少了 return。。。
你 context 里面的覆盖 redirect 的方式是错的,不要去覆盖内置的方法。
即使可以覆盖,你覆盖的方式也是错的。。。自己看下代码最后一行,返回一个函数是什么意思。
这才是正确的覆盖方式 (但我非常不建议覆盖内置的方法,这种做法就跟当年 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];
}
}