JavaScript
1app.get('/users/:id', (req, res) => { 2 const _id = req.params.id 3 User.findById(_id).then((user) => { 4 if (!user) { 5 return res.status(404).send() 6 } 7 res.send(user) 8 }).catch((e) => { 9 res.status(500).send() 10 }) 11})
if文の中でreturnが使われており、if文内の処理を実行させるとres.status(404).send()が実行されますが、これは普通にres.status(404).send()と書くのと何か違いがあるのでしょうか?
意図があってわざわざreturnを加えているとは思うのですが、どのような意図なのか分かりませんでした。
分かる方いらっしゃいましたらぜひご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
問題の部分だけを展開します。
js
1function (user) { 2 if (!user) { 3 return res.status(404).send() 4 } 5 res.send(user) 6}
これはガード節と呼ばれる書き方です。
参考記事: 初心者向け。覚えておきたい 「ガード節」という書き方。 - Qiita
普通に書くとこうなります。
js
1function (user) { 2 if (!user) { 3 res.status(404).send() 4 } else { 5 res.send(user) 6 } 7}
このif-elseは処理が複雑になればなるほどインデントがネストされていき、
非常に読みづらくなってしまいます。
そこで探索を早期に打ち切るのがガード節というテクニックです。
Node.jsのExpress.js系だと思われますが、
Express.jsのres.send
メソッドは2回実行するとエラーになります。
なのでelse側は実行させてはいけません。
ifに入ったものを早期に終了させるreturnが必要不可欠となります。
js
1function (user) { 2 if (!user) { 3 res.status(404).send() 4 return // 返り値なしで処理を打ち切る明示的なreturn 5 } 6 res.send(user) 7}
returnによる返り値は基本的に後で使うと明示した方が良いのは事実ですが、
別に不具合が発生しないとわかっている箇所ならば問題ありません。
今回はUser.findById(_id).then(fn1).catch(fn2)
のfn1の部分で実行しますよと記述されていますから、返り値は誰も使って居ないのが一目瞭然ですね。
まぁ、行数が減ると読む時に楽なんで、
私が自分一人のプロジェクトでif文で1行だけの時は{}
すら省略出来るのでこんな感じで横着してます。
js
1function (user) { 2 if (!user) return res.status(404).send() 3 res.send(user) 4}
投稿2020/07/13 07:16
総合スコア21203
0
質問の意図
私はNode.jsに詳しくありませんが、既存の回答の方向性に疑問を感じるため、あえて回答します。
if文の中でreturnが使われており、if文内の処理を実行させるとres.status(404).send()が実行されますが、これは普通にres.status(404).send()と書くのと何か違いがあるのでしょうか?
意図があってわざわざreturnを加えているとは思うのですが、どのような意図なのか分かりませんでした。
ここでいう「意図」とは、
JavaScript
1if (!user) { 2 return res.status(404).send() 3}
と
JavaScript
1return res.status(404).send()
の違いは何ですか、と解釈しました。
「ガード節を使う意図」は、各コードの挙動を理解していることが前提ですが、その前提に至っていないと感じます。
Node.js Document
検索して、
https://www.google.com/search?q=site%3Anodejs.org+status+send
getメソッドのドキュメントを読んで、
https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_http_get_options_callback
The callback is invoked with a single argument that is an instance of http.IncomingMessage.
に、うなる
- 質問コードの第二引数
res
はどこに? - 質問コードの第一引数
req
を利用してststusCodeがとれそうな気が…
Express.js
発想を変えて、"res.status-404" て検索すると、Express.jsのドキュメントがHIT
https://www.google.com/search?q=res.status-404
ようやく、statusメソッドのドキュメントを発見する。
https://expressjs.com/ja/4x/api.html
res.send([body])
Sends the HTTP response.The body parameter can be a Buffer object, a String, an object, or an Array. For example:
res.status(code)
Sets the HTTP status for the response. It is a chainable alias of Node’s response.statusCode.
質問コードを読む
質問コードは、
JavaScript
1if (!user) { 2 return res.status(404).send() 3} 4res.send(user)
Express.jsのドキュメントに従い、
- 変数
user
がfalsyのとき、「HTTPステークスコード=404」「body=空」を返す - それ以外は、「body=変数
user
値」を返す
という挙動になります。
ガード節(早期リターン)を使うべきか
ガード節(早期リターン)を使うべき論については、私は懐疑的な立場です。
この場合、
JavaScript
1return user ? res.send(user) : res.status(404).send();
このように、後期リターンに変更しても、何も問題がありません。
早期リターンが速いという見解もありましたが、「変数 user
がtruyhy/falsyのどちらの割合が多いか」の結果を見て、評価順を判断するのが妥当と考えます。
設計や要件にもよると思いますが、ユーザが発見される挙動を正とするなら、この場合は後期リターン型を私は採用します。
Re: __stsh さん
投稿2020/07/14 04:05
総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 16:41 編集
2020/07/14 23:22 編集
2020/07/14 23:30
2020/07/15 04:00
2020/07/15 04:59
0
この return は処理をそこで打ち切りたいからつけてるだけですね
returnがないと、後続の処理が流れてしまって意図しない結果になるのでしょう。
このコードであれば、 !user
ということなので、多分ログインしてない状態であれば
404を返して終わり。 という意味かと思います。
投稿2020/07/13 06:52
総合スコア2027
0
回答、みなさんのおっしゃるとおりです。
if (xxx) { return res.status(404).send(); }
上記は、下記の意味ですよね。
if (xxx) { res.status(404).send() return; }
上の書き方は短くかけるメリットあるのですが returnに戻り値が何もないことが明示的ではないので、戻り値はなんなんだろう?と迷いを生むために、よい書き方ではないと思います。
また、こんな記事もありました。
if文の括弧は省略できるなら省略するのは是か非か | バシャログ。
http://bashalog.c-brains.jp/09/08/05-004630.php
投稿2020/07/13 09:09
編集2020/07/13 09:10総合スコア197
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
nodeはいまいちわかりませんがreturnをつけると
コールバック関数においてその後ろに処理が流れない効果が期待できます。
投稿2020/07/13 06:35
編集2020/07/13 06:36総合スコア116724
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/13 09:19
2020/07/13 09:36 編集
2020/07/13 09:47 編集
2020/07/13 10:38
2020/07/13 11:02
2020/07/13 12:52
2020/07/13 12:59
2020/07/13 13:56 編集
2020/07/13 13:59
2020/07/13 15:55 編集
2020/07/13 21:48
2020/07/14 03:09
2020/07/14 06:20 編集
2020/07/14 14:40 編集