为什么未定义对象的新实例?

时间:2019-07-07 21:21:43

标签: javascript node.js node-telegram-bot-api

我无法使用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

3 个答案:

答案 0 :(得分:1)

您是否检查了ballBot是否已定义? 需要主文件时,请尝试取下括号。如果您想在代码中共享同一实例,我也建议使用Singleton模式。

答案 1 :(得分:1)

此处未在代码中显示它,但是您可能具有循环依赖性,其中A require s B,B require s 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,因此在附加事件处理程序时,它可能具有某种委派机器人实例的方式。如果是这样,请使用它!

答案 2 :(得分:0)

第二行是否有错字?应该 myAwesomeBot不是myAwseomeBot。

const ballBot = myAwseomeBot;