質問編集履歴

5 コードの誤りを修正

hojo

hojo score 191

2016/11/18 15:45  投稿

koa-routerでリダイレクトせずにrouterを切り替えることはできますか?
nodejs + koaを利用してウェブサイトを作っています。
また、その環境の中でkoaのミドルウェアである`koa-router`を利用してリクエストが発生したpathに対して処理を振り分けています。
その振り分けてある処理をリダイレクトせずにrouterに登録した他の関数に切り替えることはできますでしょうか?
つまり以下のようなことがしたいのですがどのようにすれば可能でしょうか?
```
const app = require('koa')()
const router = require('koa-router')()
router.get('/', function*(){
 // this.redirect('/login') // 1.リダイレクトならうまくいくが使いたくない
 // this.url = '/login' // 2.これは期待した動作はしてくれない
 // 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書き換えようと思っています。)
どうかよろしくお願いいたします。
  • Node.js

    3419 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

4 細かい部分を修正

hojo

hojo score 191

2016/11/18 15:42  投稿

koa-routerでリダイレクトせずにrouterを切り替えることはできますか?
nodejs + koaを利用してウェブサイトを作っています。
また、その環境の中でkoaのミドルウェアである`koa-router`を利用してリクエストが発生したpathに対して処理を振り分けています。
その振り分けてある処理をリダイレクトせずにrouterに登録した他の関数に切り替えることはできますでしょうか?
つまり以下のようなことがしたいのですが可能でしょうか?
つまり以下のようなことがしたいのですがどのようにすれば可能でしょうか?
```
const app = require('koa')()
const router = require('koa-router')()
router.get('/', function*(){
 // this.redirect('/login') // 1.リダイレクトならうまくいくが使いたくない
 // this.url = '/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書き換えようと思っています。)
どうかよろしくお願いいたします。
  • Node.js

    3419 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

3 読みにくかったので修正

hojo

hojo score 191

2016/11/18 15:39  投稿

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

    3419 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

2 文章が未完成だったので修正島sチア。

hojo

hojo score 191

2016/11/18 15:35  投稿

koa-routerでリダイレクトせずにrouterを切り替えることはできますか?
nodejs + koaを利用してウェブサイトを作っています。
また、その環境の中でkoaのミドルウェアである`koa-router`を利用してリクエストが発生したpathに対して処理を振り分けています。
その振り分けてある処理をリダイレクトせずにrouterに登録した他の関数に切り替えることはできますでしょうか?
つまり以下のようなことがしたいのですが可能でしょうか?
```
const app = require('koa')()
const router = require('koa-router')()
router.get('/', function*(){
 // this.redirect('/login') // リダイレクトならうまくいくが使いたくない
 // this.url = '/login' // これは期待した動作はしてくれない
 // this.body = 'this is login page.' // これは期待した動作に近いが出力結果が同じだけで切り替わったわけではない
 // this.redirect('/login') // 1.リダイレクトならうまくいくが使いたくない
 // this.url = '/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を切り替えることで実現しました。(つまり上記コードに例えるならば`router.get('/', function*(){ ...})`の末尾に`this.body = 'this is login page.'`を書いて`/login`と同じHTMLを返すことであたかも異なるrouterが実行されたかのようにしたということです)
その時は上記のコードとは別の手法をとりまして、routerに登録した関数を切り替えることはせずに、出力するHTMLを切り替えることで実現。(つまりコメントアウトの3番目)
しかし、この方法では、繊維先のページで必要としている処理を実行することはできません。`/login`の方に記述された`this.hoge = 1`は実行されないのです。
しかし、この方法では、繊維先のページで必要としている処理を実行することはできません。具体的には`/login`の方に記述された`this.hoge = 1`は実行されない...
`this.jump()`のようなメソッドがあれば実現できるのに...
経緯としては上記のような具合です。
また、リクエストがあったpathと表示結果が異なるため、リフレッシュをかけた時におかしなことになってしまうという問題が発生しそうですが、今はこの問題は気にしないでいただきたいです(histry.replaceStateでurl書き換えようと思っています。)
どうかよろしくお願いいたします。
  • Node.js

    3419 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

1 タイトルがわかりにくいので省略しました。

hojo

hojo score 191

2016/11/18 15:27  投稿

koa-routerでリダイレクトせずにrouterに登録した他の関数に切り替えることはできますか?
koa-routerでリダイレクトせずにrouterを切り替えることはできますか?
nodejs + koaを利用してウェブサイトを作っています。
また、その環境の中でkoaのミドルウェアである`koa-router`を利用してリクエストが発生したpathに対して処理を振り分けています。
その振り分けてある処理をリダイレクトせずにrouterに登録した他の関数に切り替えることはできますでしょうか?
つまり以下のようなことがしたいのですが可能でしょうか?
```
const app = require('koa')()
const router = require('koa-router')()
router.get('/', function*(){
// this.redirect('/login') // リダイレクトならうまくいくが使いたくない
// this.url = '/login' // これは期待した動作はしてくれない
// this.body = 'this is login page.' // これは期待した動作に近いが出力結果が同じだけで切り替わったわけではない
})
router.get('/login', function*(){
this.hoge = 1
this.body = 'this is login page.'
})
app
.use(router.routes())
.use(router.allowedMethods())
.listen(3000)
```
何故このようなことがしたいか、という話を念のためしておきます。
リダイレクトはブラウザのリクエスト先を変更するための強力な手法ですが、リダイレクトを何も考えずに行うと、リクエストが無駄に発生してしまうためにサーバ負荷とユーザビリティ(レスポンス速度)の面で良い結果を生まないと思っています。
そこでリダイレクトを行わずにリダイレクト先の結果を返してあげればリダイレクトを行った時と同じような結果を得られるのではないか?と思い実際に試してみました。
その時は上記のコードとは別の手法をとりまして、routerに登録した関数を切り替えることはせずに、出力するHTMLを切り替えることで実現しました。(つまり上記コードに例えるならば`router.get('/', function*(){ ...})`の末尾に`this.body = 'this is login page.'`を書いて`/login`と同じHTMLを返すことであたかも異なるrouterが実行されたかのようにしたということです)
しかし、この方法では、繊維先のページで必要としている処理を実行することはできません。`/login`の方に記述された`this.hoge = 1`は実行されないのです。
  • Node.js

    3419 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る