nodejs + koaを利用してウェブサイトを作っています。
また、その環境の中でkoaのミドルウェアであるkoa-router
を利用してリクエストが発生したpathに対して処理を振り分けています。
その振り分けてある処理をリダイレクトせずにrouterに登録した他の関数に切り替えることはできますでしょうか?
つまり以下のようなことがしたいのですがどのようにすれば可能でしょうか?
const app = require('koa')() const router = require('koa-router')() router.get('/', function*(){ // this.redirect('/login') // 1.リダイレクトならうまくいくが使いたくない // this.path = '/login' // 2.これは期待した動作はしてくれない // this.body = 'this is login page.' // 3.これは期待した動作に近いが出力結果が同じだけで切り替わったわけではない this.jump('/login') // このようなことができれば嬉しいのだが... }) router.get('/login', function*(){ this.hoge = 1 this.body = 'this is login page.' }) app .use(router.routes()) .use(router.allowedMethods()) .listen(3000)
何故このようなことがしたいか、という経緯を念のため記載しておきます。
リダイレクトはブラウザのリクエスト先を変更するための強力な手法だが、リダイレクトを何も考えずに行うと、リクエストが無駄に発生してしまうためにサーバ負荷とユーザビリティ(レスポンス速度)の面で良い結果を生まない...
そこでリダイレクトを行わずにリダイレクト先の結果を返してあげればリダイレクトを行った時と同じような結果を得られるのではないか?と思い実際に試してみる。
その時は出力結果を変えるという手法をとり、routerに登録した関数を切り替えることはせずに、出力するHTMLを切り替えることで実現。(つまりコメントアウトの3番目)
しかし、この方法だと繊維先のページで必要としている処理を実行することはできない。具体的には
/login
の方に記述されたthis.hoge = 1
は実行されない...
this.jump()
のようなメソッドがあれば実現できるのに...
経緯としては上記のような具合です。
また、リクエストがあったpathと表示結果が異なるため、リフレッシュをかけた時におかしなことになってしまうという問題が発生しそうですが、今はこの問題は気にしないでいただきたいです(histry.replaceStateでurl書き換えようと思っています。)
どうかよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。