質問: req.params.id User.findById(_id).then((user) => { if (!user) { return res.status(404).send() } res.send(user) }).catch((e) => { res.status(500).send() }) }) ``` if文の中でreturnが使われており、if文内の処理を実行させるとres.status(404).send()が実行されますが、これは普通にres.status(404).send()と書くのと何か違いがあるのでしょうか? 意図があってわざわざreturnを加えているとは思うのですが、どのような意図なのか分かりませんでした。 分かる方いらっしゃいましたらぜひご教授ください。
回答: 問題の部分だけを展開します。 ``` function (user) { if (!user) { return res.status(404).send() } res.send(user) } ``` これは**ガード節**と呼ばれる書き方です。 参考記事: 初心者向け。覚えておきたい 「ガード節」という書き方。 - Qiita 普通に書くとこうなります。 ``` function (user) { if (!user) { res.status(404).send() } else { res.send(user) } } ``` このif-elseは処理が複雑になればなるほどインデントがネストされていき、 非常に読みづらくなってしまいます。 そこで探索を早期に打ち切るのがガード節というテクニックです。 Node.jsのExpress.js系だと思われますが、 Express.jsの`res.send`メソッドは2回実行するとエラーになります。 なのでelse側は実行させてはいけません。 ifに入ったものを早期に終了させるreturnが必要不可欠となります。 ``` function (user) { if (!user) { res.status(404).send() return // 返り値なしで処理を打ち切る明示的なreturn } res.send(user) } ``` returnによる返り値は基本的に後で使うと明示した方が良いのは事実ですが、 別に不具合が発生しないとわかっている箇所ならば問題ありません。 今回は`User.findById(_id).then(fn1).catch(fn2)`のfn1の部分で実行しますよと記述されていますから、返り値は誰も使って居ないのが一目瞭然ですね。 まぁ、行数が減ると読む時に楽なんで、 私が自分一人のプロジェクトでif文で1行だけの時は`{}`すら省略出来るのでこんな感じで横着してます。 ``` function (user) { if (!user) return res.status(404).send() res.send(user) } ```