为什么未定义对象的新实例?
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 require
s B,B require
s A.
与您的用例相关的最简单的解决方案是 define 和 implement 在附加文件中为您的 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 所以它可能有某种方式在附加事件处理程序时委托机器人实例。如果有,就用它!
我无法在另一个使用 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 require
s B,B require
s A.
与您的用例相关的最简单的解决方案是 define 和 implement 在附加文件中为您的 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 所以它可能有某种方式在附加事件处理程序时委托机器人实例。如果有,就用它!