長いことExpress.jsでサーバー側を書いていると、使っているのかどうかわからないエンドポイントが出てくるかもしれない。特に社内ツールとかだと、度重なる仕様変更とか、途中でそもそも別のリポジトリに分割されたとか。
以下のようなミドルウェアを作成すれば、全アクセスでパスが取得できる。
app.use("*", async (req, _res, next) => {
const fullUrl = new URL(
req.originalUrl,
`${req.protocol}://${req.get("host")}`,
);
console.log({fullUrl.pathname});
next();
});
あとは、アクセスがあった部分をDBに入れていく。そのまま1ヶ月くらい放置して、DBに上がらなかったら使っていない(あるいは使用頻度が極端に少ない)エンドポイントである。
簡単にsupabaseで書くとこんな感じ。
app.use("*", async (req, _res, next) => {
const fullUrl = new URL(
req.originalUrl,
`${req.protocol}://${req.get("host")}`,
);
if (!fullUrl.pathname.includes("/trpc/")) {
const { data, error } = await supabase
.from("endpoint")
.upsert({ path: fullUrl.pathname })
.select("*");
console.info(data);
if (error) {
console.error(error);
}
}
next();
});
trpcが含まれている場合は使われているケースが多いのでログに残さないようにしている。僕が消し去りたいのはtrpcを使う以前に自分で書いていたrouter.getとかなのだ。
あとはnginxのログをalpに食わせて調べるという手もある。こちらのほうが正攻法だし、無駄な処理もないだろう。今回はテストサーバーでログをそこまで残していなかったので、この手法を取ることにした。
デッドコードが消えていくと気持ちがいい。意外とデッドコードでしか使っていないライブラリなんかも発見できたりする。