Express res.json()で処理を終了する方法
Expressを用いて以下のようなコードを実装しました。
javascript
1router.post('/', (req, res) => { 2 --省略-- 3 if (flag) { 4 res.json('data1': data1) 5 } 6 7 res.json('data2': data2) 8})
この処理が呼び出されたとき、flagがfalseであれば問題はないのですが、flagがtrueのときにres.json('data1': data1)が呼び出された後に、res.json('data2': data2)も呼び出され、
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
という2度レスポンスが送られた旨のエラーが発生します。
javascript
1router.post('/', (req, res) => { 2 --省略-- 3 if (flag) { 4 res.json('data1': data1) 5 } else { 6 res.json('data2': data2) 7 } 8})
とすれば当然エラーは発生しなくなります。このような仕様になっているのはres.json()の後も処理が行われることが前提となっているためですが、res.json()の後に処理をする必要がなく、それらの処理を無視したい場合
javascript
1router.post('/', (req, res) => { ・・・➀ 2 --省略-- 3 if (flag) { 4 res.json('data1': data1) 5 ➀を終了させる処理 6 } 7 8 res.json('data2': data2) 9 ➀を終了させる処理 10})
のように「➀を終了させる処理」は存在するのでしょうか。
追記が多くなってしまったので少しまとめます。
・returnを使う方法 → ➀内でさらに関数を(メソッドの引数などで)呼び出し、その関数内でres.json()を実行するときに➀を抜けられない。入れ子にしないなら使える。
この他に何かよい方法をご存知でしたらぜひお教えください
###追記
実際には
javascript
1router.post('/', (req, res) => { 2 --省略-- 3 if (flag) { 4 return res.json('data1': data1) 5 } else { 6 return res.json('data2': data2) 7 } 8})
のように実装していたのですが、
javascript
1router.post('/', (req, res) => { ・・・Ⅰ 2 --省略-- 3 AAAA() 4 .then((flag) => { ・・・Ⅱ 5 if(flag) { 6 return res.json('data1': data1) ・・・Ⅲ 7 } else { 8 return res.json('data2': data2) ・・・Ⅳ 9 } 10 }) 11 .then((DATA) => { //res.json()の戻り値 12 --省略-- 13 }) 14 15 return res.json('data3': data3) ・・・Ⅴ 16})
のようなコードを考えた時、
ⅢもしくはⅣが実行されるのはⅡの関数内であり、このreturnではres.jsonの戻り値がDATAとして次の関数に渡されるだけでⅠを抜けられないことからreturn以外の方法があればと思い質問しました。
説明が不足しており、大変申し訳ありませんでした。
###追記2
確かに上記のコードではⅤが先に実行されますね。
コードを修正します。
javascript
1router.post('/', (req, res) => { ・・・Ⅰ 2 --省略-- 3 AAAA() 4 .then((flag) => { ・・・Ⅱ 5 if(flag) { 6 return res.json('data1': data1) ・・・Ⅲ 7 } else { 8 return res.json('data2': data2) ・・・Ⅳ 9 } 10 --省略-- 11 }) 12 .then((DATA) => { //res.json()の戻り値 13 --省略-- 14 return res.json('data3': data3) ・・・Ⅴ 15 }) 16})
このコードではⅢもしくはⅣが実行された後にⅤが実行されエラーになると思います。
#追記3
javascript
1router.post('/', (req, res) => { ・・・Ⅰ 2 --省略-- 3 AAAA() 4 .then((flag) => { ・・・Ⅱ 5 if(flag) { 6 return res.json('data1': data1) ・・・Ⅲ 7 } else { 8 return res.json('data2': data2) ・・・Ⅳ 9 } 10 --省略-- 11 }) 12 .then((DATA) => { //res.json()の戻り値 13 --省略-- 14 return res.json('data3': data3) ・・・Ⅴ 15 }) 16})
この処理をreturnが使えない例として挙げたのはよくなかったかもしれません…
res.json()の実行後にⅠを抜ける共通処理的なものはあるのでしょうか。
回答1件
あなたの回答
tips
プレビュー