【问题标题】:How would I assign a Javascript variable to another Javascript variable? (a little confusing, i know)如何将 Javascript 变量分配给另一个 Javascript 变量? (有点混乱,我知道)
【发布时间】:2020-07-01 12:47:57
【问题描述】:

所以,我最近遇到了一个问题!

我试图为变量值分配一个值(我知道有点混乱)。我试图为我的 Discord 机器人创建一个库系统,它使用 JavaScript (Node.js)!

所以,这是我正在努力解决的部分代码:

    flist.forEach(item1 => {
        liblist.forEach(item => {
            eval(item1 = require(item));
        });
    });

好的,所以基本上必须将item1 替换为库文件的名称(如果文件名为cmdh,我将其用作变量名以将require(item) 分配给它)

编辑:顺便说一下,item1 是文件名。

编辑2:这是文件util.js的一部分:

const Discord = require("discord.js");
const fs = require("fs");
function genEmbed(title, desc, col) {
    return new Discord.MessageEmbed().setTitle(title).setDescription(desc).setColor(col);
};
function log(inp) {
    console.log(`[UTIL] ${inp}`);
};

function loadDef() {
    log("Loading libraries...");
    dirlist = [];
    liblist = [];
    flist = [];
    fs.readdir("./libraries", (err, dirs) => {
        if(err) console.error(err);
        dirs.forEach(dir => {
            dirlist.push("./libraries/" + dir); 
        });
        dirlist.forEach(dir => {
            fs.readdir(dir, (err, files) => {
                if(err) console.error(err);
                files.forEach(file => {
                    if(file.includes(".")) {
                        liblist.push(require(dir + "/" + file));
                        filename = file.split(".")[0];
                        flist.push(filename);
                    } else {
                        log(`${file} is a directory, ignoring...`)
                    };
                });
            });
        });
    });
    flist.forEach(item1 => {
        liblist.forEach(item => {
            eval(item1 = require(item));
        });
    });
    log("Libraries loaded!");
};

module.exports = {
    genEmbed,
    loadDef
};

【问题讨论】:

标签: javascript node.js bots discord


【解决方案1】:

如果您尝试为数组中的每个元素分配一个新值并返回一个包含更新值的新数组,您应该使用map 而不是forEach

如果您想从liblist 返回一个包含所需库的数组并将结果存储在flist 中,您的代码应如下所示:

    flist = liblist.map(item => require(item));

基本上,map 从数组中获取每个值,对其应用一个函数(在您的情况下为 require),然后返回一个包含函数结果的新数组。

需要注意的是,还需要将fs.readdir替换为fs.readdirSync,否则调用代码时liblist会为空。


在我们对聊天进行讨论后,我了解到您希望在主文件中将变量设置为全局变量。但是,这有点骇人听闻。为此,您需要修改 global 对象。

注意:我建议您改为通过const libraryName = require('./libraries/fileName.js') 静态要求,因为这种动态定义库的方式在这种情况下没有优势,只会使代码更加复杂。动态需要库仅在您通过库添加侦听器时才有意义,但您不需要将它们存储为全局变量。

您的 utils 文件的完整代码现在应如下所示:

const Discord = require("discord.js");
const fs = require("fs");
function genEmbed(title, desc, col) {
    return new Discord.MessageEmbed().setTitle(title).setDescription(desc).setColor(col);
};
function log(inp) {
    console.log(`[UTIL] ${inp}`);
};

function loadDef() {
    log("Loading libraries...");
    libraries = {};
    const dirlist = fs.readdirSync("./libraries").map(dir => "./libraries/" + dir)
    dirlist.forEach(dir => {
        const files = fs.readdirSync(dir)
        files.forEach(file => {
            if(file.includes(".")) {
                filename = file.split(".")[0];
                libraries[filename] = require(dir + "/" + file);
            } else {
                log(`${file} is a directory, ignoring...`)
            };
        });
    });
    log("Libraries loaded!");
    return libraries;
};

module.exports = {
    genEmbed,
    loadDef
};

现在你还需要修改你的主文件中的代码,如下:

const libraries = loadDef()
global = Object.assign(global, libraries) // assign libraries to global variables

【讨论】:

  • 不知道怎么用,可以给我固定文件的代码吗?
  • @MantvydasViršilas 您只需将上面发布的代码 sn-p 替换为此处的代码 sn-p。我将编辑我的帖子以显示完整文件。
  • 需要注意的是还需要将fs.readdir替换成fs.readdirSync,否则调用代码时liblist会为空。
  • @MantvydasViršilas 您是否将fs.readdir 替换为fs.readdirSync
  • 我也替换了代码行,也没有工作(readdirSync)
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2023-03-26
  • 1970-01-01
  • 2014-03-04
  • 2014-04-23
  • 2014-06-04
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多