Discord.js+expressでサーバーを立ててますが、ファイル分割をしている末端のファイルhoge.js
などのなかでDiscord.jsのClientを呼び出したいというニッチな話
main.js
|- actions
|- router
|- hoge.js
main.jsでclient = new Client()
をしていますが、末端でhoge.jsではclientオブジェクトが定義されてなく、client.channels.cache.get().send()
を使いたいけど使えない、みたいな状態でした。
main.jsで定義したclient変数をhoge.jsに持っていきたいなというところでしたが、公式ドキュメントとすぎゃーんさんの記事が参考になりました。
Express アプリケーションで使用するミドルウェアの作成
expressでapp全体の設定値をroutesで使う(module間で変数を受け渡す)方法いろいろ
結論: ミドルウェア関数とreqを利用
色々なやり方ある模様ですが、一旦このやり方で落ち着きました。
main.js内でミドルウェア関数を作成し、req.discordClient
を定義してclientを可能しておきます。
//省略
const client = new Client(); //(色々端折っているけど)
const myConfig = function (req, res, next) {
req.discordClient = client;
next();
}
app.use(myConfig);
//省略
これで他の箇所で呼び出すreqオブジェクトでreq.discordClientが利用できるようになりました。
module.exports = async (req, res) => {
// Discord BotのClientオブジェクト
const client = req.discordClient;
`client.channels.cache.get(<discord_room_id>).send('ほげほげ');`
}
終わってみるとあっけないですが歴史がある分色々なやり方が紹介されていてなかなか調べにくかったですね......