0

我无法使用 nodejs 在另一个 java 脚本文件中使用相同的对象实例。

我正在开发一个用于电报的机器人。因为文件变得大而混乱,我想将我的机器人的功能拆分成几个额外的 js 文件。但我不知道如何在多个 javascript 文件之间共享同一个对象实例。

///////////////////////8Ball File
const {eightBall} = require("./main");
const ballBot = myAwseomeBot;

function eightBall() {

    ballBot.onText(/\/8ball/, (msg, callback) => {
        let ranNum = Math.floor(Math.random() * 15) + 1;
        const chatId = msg.chat.id;
        const reply_to_message_id = msg.message_id;
        console.log(ranNum);
        switch (ranNum) {
            case 1:
                ballBot.sendMessage(chatId, "Ja");
                break;
      }
    })
}


//main file

let myAwesomeBot  = new TelegramBot(botToken, {polling:true});
exports.myAwesomeBot = myAwesomeBot;










ballBot.onText(/\/8ball/, (msg, callback) => {
        ^
TypeError: Cannot read property 'onText' of undefined
4

3 回答 3

1

它没有在你的代码中显示,但你可能有一个循环依赖,其中 A requires B,B requires A。

与您的用例相关的最简单的解决方案是在附加文件中为您的机器人定义实现命令,并让您的机器人文件附加/使用它们:

8ball.js

import { telegram stuff } from 'wherever';

export myCommand1 = {
  pattern: /\/8ball/,
  eventName: 'ontext',
  callback: (msg, msgCallback) => { /* use "this" as if it were the bot instance */};
};

main.js

import .... from ....;
import { myCommand1 } from '8ball';

...
bot.onText(myCommand1.pattern, myCommand1.callback.bind(bot));
...

可能还有其他更适合附加通用事件处理程序/侦听器的 bot 类方法,以及指定模块导出的其他方法,但想法是您的命令文件不需要导入 bot 文件。我还没有研究过电报机器人 API,因此在附加事件处理程序时它可能会以某种方式委派机器人实例。如果是这样,请使用它!

于 2019-07-08T03:44:56.373 回答
1

您是否检查了 ballBot 是否已定义?需要主文件时尝试删除括号。如果您想在代码中共享相同的实例,我还建议使用单例模式。

于 2019-07-07T21:42:30.530 回答
0

会不会是第2行有错字?应该是 myAwesomeBot 而不是 myAwseomeBot。

const ballBot = myAwseomeBot;

于 2019-07-07T21:26:59.147 回答