如果这个问题没有实际意义,我深表歉意-我可能对module.export
的工作方式以及各类之间的作用域缺乏足够的了解,但我会尽力进行解释。我目前有一个带有音乐播放器的Discord机器人,该音乐播放器具有一个MusicPlayer
类-此类以以下方式导出:
const ytdl = require('ytdl-core-discord');
const MusicQueue = require('./musicqueue');
const discordUtils = require ('../../../utils/discord-utils');
class MusicPlayer {
constructor() {
this.repeat_playlist = false;
this.queue = new MusicQueue(); // this is the persistent queue for the server
this.dispatcher = null;
this.volume = 1;
this.stopped = true;
this.paused = false;
this.repeat_current_song = false;
this.auto_delete = false;
this.manual_index = false;
this.autodcEnabled = false;
}
....
}
module.exports = new MusicPlayer();
我有各种与音乐相关的命令可以像这样导入此音乐播放器:
const { Command } = require('discord.js-commando');
const discordUtils = require ('../../utils/discord-utils');
let musicplayer = require(`./modules/musicplayer`);
module.exports = class TestCommand extends Command {
constructor(client) {
....
}
...
}
我的问题是,由于我通过musicplayer
导出了局部变量,该如何将其传递给module.exports = new MusicPlayer();
构造函数?
据我了解,使用module.exports = new MusicPlayer();
将使我可以在整个项目中使用相同的musicplayer
对象(这是我想要的);但是-这是我不确定module.exports
的工作原理的地方-无法保证musicplayer
何时会实例化。
如果您从不使用与音乐相关的命令,则将不会创建musicplayer
,因为将不会运行let musicplayer = require('./modules/musicplayer');
,对吗?
无论哪种方式,现在我都需要从其中一个命令中将某些内容传递给musicplayer
构造函数,该如何以不必重复执行以下操作的方式做到这一点:{{1 }}中每个需要音乐播放器的文件中的 ?我是否可以一次声明let musicplayer = require('./modules/musicplayer')(variable);
并在整个代码库中使用let musicplayer = require('./modules/musicplayer')(variable);
?
答案 0 :(得分:0)
让我们列出一些要求:
要使此工作有效,您必须集中创建音乐播放器,并且必须与具有要传递给构造函数的初始化变量的任何人协调。有很多方法可以做到这一点。我将说明其中的两个。
让我们假设在创建音乐播放器时要使用此变量的是您的应用程序初始化代码。因此,与其让每个人都自己加载音乐播放器模块,不如让他们都向应用程序询问音乐播放器。
// app.js
const MusicPlayer = require(`./modules/musicplayer`); // load module to get constructor
let musicPlayerInitVariable; // your code sets this during startup
const sharedPlayer;
function getMusicPlayer() {
if (!sharedPlayer) {
sharedPlayer = new MusicPlayer(musicPlayerInitVariable);
}
return sharedPlayer;
}
// one of many possible exports from your app
module.exports = { getMusicPlayer };
然后,在要访问共享音乐播放器的任何应用程序文件中,只需执行以下操作:
const musicPlayer = require('./app.js').getMusicPlayer();
这要求任何使用共享musicPlayer的人都知道如何引用app.js。
另一种实现方法是拥有您的应用,使用一些初始状态初始化音乐播放器模块本身,然后在根据需要创建音乐播放器时可以使用该初始状态。
// musicplayer.js
const ytdl = require('ytdl-core-discord');
const MusicQueue = require('./musicqueue');
const discordUtils = require ('../../../utils/discord-utils');
class MusicPlayer {
constructor() {
this.repeat_playlist = false;
this.queue = new MusicQueue(); // this is the persistent queue for the server
this.dispatcher = null;
this.volume = 1;
this.stopped = true;
this.paused = false;
this.repeat_current_song = false;
this.auto_delete = false;
this.manual_index = false;
this.autodcEnabled = false;
}
....
}
// this is the constructor variable
// You can either give it a default value so things will work if the player
// is not configured or if you don't give it a default value, then the code
// will require that configurePlayer() is called first
let musicPlayerInitVariable;
// call this before anyone calls getMusicPlayer()
function configurePlayer(data) {
// save this for later
musicPlayerInitVariable = data;
}
let sharedPlayer;
function getMusicPlayer() {
if (!sharedPlayer) {
if (!musicPlayerInitVariable) {
throw new Error('Music player must be configured with configurePlayer() first')
}
sharedPlayer = new MusicPlayer(musicPlayerInitVariable);
}
return sharedPlayer;
}
module.exports = { getMusicPlayer, configurePlayer };
然后,在应用启动代码中的某个位置,执行以下操作:
require('./modules/musicplayer').configurePlayer(passMagicVariableHere);
从那时起,任何人都可以做:
const musicPlayer = require('./modules/musicplayer').getMusicPlayer();