◆ app.context は各リクエストの ctx のプロトタイプ
◆ app.context のプロパティにデータを入れておけば全 ctx で参照できる
◆ グローバルを使ったりデータ置き場用モジュールを使わず全体でデータを共有できる

Node.js は PHP などと違って 全部のリクエストを同じスレッドで受け取るので全リクエストで同じ変数を共有できます
なので PHP のリクエストごとに DB にアクセスしてデータを取得してという当たり前だったことすらしなくていいです
DB に保存したい全データが小さくて十分変数に保持できるなら 最初に全部ロードしてしまって変数上のデータを使って 更新処理があったタイミングでその部分だけ DB にも更新すればいいです
全部は無理な場合でもアプリケーション全体の設定データや 数が限られているデータなどは変数上に置いてしまえます

こういうリクエスト内だけで終わらない全体のデータや ロガー・ DB などのインスタンスといった アプリケーション全体として保持したいデータはどこの変数に入れるか悩みます

単純なのはグローバルですが グローバル変数はあまり使いたいものではないです
グローバルに置いたデータ全体がわかりにくいのと 見れなくていい場所でも見れてしまう問題があります
それに 将来的に同じ Node.js 中で別のこともするようになった場合それらのデータと共有してしまうことになります
別のことをするなら Node.js プロセス自体を別に作るのが良いと思いますが めんどうなので 1 つのにまとめてしまうケースもあります
そう考えるとグローバルはなしです

なので これまではデータ置き場にするモジュールを作ってそれを require することで得られるオブジェクトのプロパティを使うことにしていました
それでも多くのファイルでデータ置き場のモジュールを require するように書いていると もっといい方法なんかないのかなと思います
フレームワークを使ってるのだからフレームワークにそういう場所がないかなと Koa を調べてみると良さそうな場所がありました

場所は app.context.*** です

Koa では各リクエストで ctx が作られます
これにはデフォルトで各リクエストに関するいろいろな情報が入っていますが フレームワークのユーザがリクエストに対する独自のデータをもたせるのにも使えます
app.context はこの ctx のプロトタイプオブジェクトです
リクエスト時には app.context を元に作成されます

const context = Object.create(this.context);

application.js の createContext 中の処理はこうなっていて this は application (app) になっています
そのため app.context のプロパティにデータを入れておけばすべてのリクエストの ctx で参照が可能です

module.exports = (ctx, next) => {
console.log(ctx.my_data)
return next()
}

フレームワークに関連する部分は基本 ctx を受け取るのであちこちで保存場所を require する必要がなくていいですね