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

Why is a new instance of a object undefined?

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

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

///////////////////////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

会不会是第2行打错了?应该 myAwesomeBot 不是 myAwseomeBot。

const ballBot = myAwseomeBot;

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

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

与您的用例相关的最简单的解决方案是 defineimplement 在附加文件中为您的 bot 命令,并让您的 bot文件附加/使用它们:

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));
...

可能还有其他机器人 class 方法更适合附加通用事件 handlers/listeners,以及其他指定模块导出的方法,但想法是您的命令文件不需要导入机器人文件。我没有研究电报机器人 API 所以它可能有某种方式在附加事件处理程序时委托机器人实例。如果有,就用它!