アプリケーションの機能
TelegrafJSTelegram
を使用してボットを作成していますが、これまでに、ボットを初期化して起動するというクラスを作成しました。Bot
middlewares
const Telegraf = require('telegraf');
const session = require('telegraf/session');
// Commands
const { commands } = require('../commands');
class Bot {
constructor() {
this.bot = new Telegraf(process.env.BOT_TOKEN);
this.bot.catch(error => {
console.error(`Bot error: ${error}`);
});
}
// Init bot configuration
async init() {
// Set session
this.bot.use(session.middleware());
// Set commands
this.bot.use(commands);
}
// Start the bot
async start() {
// Start the bot
await this.init();
this.bot.startPolling();
}
}
exports.Bot = Bot;
エントリファイルapp.js
はBot
、次のようにインスタンスを作成します。
const { Bot } = require('./logic/controllers/bot.controller');
let bot = new Bot();
await bot.start();
問題
commands
ミドルウェアを見ると、Composer
コマンドをに関連付けているbot
ので、基本的に次のようになります。
const Composer = require('telegraf/composer');
const { Message } = require('../controllers/message.controller');
let msgController = new Message();
let messageCommand = new Composer();
messageCommand.action(/message-delete.+/, msgController.delete);
module.exports = messageCommand;
基本的に、ユーザーがmessage-delete.message_id
上記のコマンドのコールバックを持つボタンを押すとトリガーされます。
問題は次のとおりです。
Telegram
コントローラ内でボットインスタンスを使用する必要がありますmsgController
。実際には、.delete
メソッドにパラメータを渡さずにコンテキストを使用しましたが、Telegram
常にアクセス可能でなければならない場所にボットインスタンスを保存したい場合、どうすればよいですか?
私が思ったこと
私の考えはTelegram
、クラスのインスタンスを作成するたびにボットインスタンスを渡すことです。例:
const { Markup } = require('telegraf');
const moment = require('moment');
// Models
const { MessageModel } = require('../models/message.model');
class Message {
constructor(bot){
this.bot = bot;
}
}
これを処理するための良い方法ですか、それともより良い方法がありますか?
説明したパターンは依存性注入と呼ばれ、説明した要件を満たす1つの方法です。このアプローチには根本的な問題はありません。
別の方法は、アプリがであり、Telegramボットがこれらのイベントをリッスンして反応するイベント駆動型アーキテクチャを使用することですeventEmitter
。
イベント駆動型アプローチを実装する方法は次のとおりです。
app.js
、イベント・エミッタが定義され、インスタンス化モジュールに渡さなければなりません。const EventEmitter = require('events');
class appEvents extends EventEmitter {}
const appEvents = new appEvents();
let bot = new Bot(appEvents);
let myMiddleware = new MyMiddleware(appEvents);
bot.js
イベントをリッスンして反応します。appEvents.on('event', () => {
console.log('an event occurred!');
});
appEvents.emit('event');
ここでは、依存性注入ソリューションとは異なり、モジュール間の結合は緩いです。ミドルウェアモジュールは、ボットを明示的に呼び出しません。
この疎結合は、各モジュールが次に何が起こるかを心配することなくビジネスを処理するため、利点となる可能性があります。ただし、大規模なアプリケーションでは、イベントが発行されたときに何が起こるかを知るのが難しい場合があります(アプリケーションの複数の部分がそれをリッスンして反応する可能性があるため)。
両方のアプローチの長所と短所については、オンラインでたくさんの文献があり、あなた自身の意見を述べることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加