Как мне назначить переменную значения своей переменной? - PullRequest
0 голосов
/ 20 марта 2020

У меня недавно была проблема.

Я пытаюсь присвоить значение значению переменной, я пытаюсь создать библиотечную систему для моего бота Discord, который использует JavaScript (Node.js)

Это часть кода, с которой я боролся:

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

Хорошо, поэтому в основном item1 необходимо заменить именем файла библиотеки (если файл называется cmdh , Я использую это как имя переменной, чтобы присвоить ей require(item))

Редактировать: кстати, item1 - это имя файла.

Редактировать 2: Это часть Файл утилит. 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
};

1 Ответ

1 голос
/ 20 марта 2020

Если вы пытаетесь назначить новое значение для каждого элемента в массиве и вернуть новый массив с обновленными значениями, вы должны использовать map вместо forEach.

Если вы хотите верните массив с необходимыми библиотеками из liblist и сохраните результат в flist, ваш код должен выглядеть следующим образом:

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

По сути, map принимает каждое значение из массива, применяет к ней (в вашем случае, require), а затем возвращает новый массив с результатами функции.

Следует отметить, что вам также необходимо заменить fs.readdir на fs.readdirSync, в противном случае liblist будет пустым при вызове кода.


После нашего обсуждения в чате я понял, что вы хотите установить переменные как глобальные переменные в вашем основном файле. Тем не менее, это немного хаки sh. Для этого вам нужно изменить объект 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
...