Извлечение данных из объекта внутри другой функции без записи в JSON? - PullRequest
0 голосов
/ 26 января 2020

Я работаю над написанием бота Discord с функциональностью musi c с использованием discord. js и узла, а также нескольких других пакетов, таких как yt-search и ytdl-core.

Проблема, которую я пытаюсь решить, связана с кодом ниже (newVar был просто заполнителем при тестировании):

        let regex = /^https/i;
        let isUrl = regex.test(checkUrl);
        let songInfo;

        if (!isUrl) {
            yts(suffix, function (err, r) {
                if(err) console.error(err);
                const videos = r.videos;
                let data = JSON.stringify(videos[0])
                fs.writeFileSync('youtube.json', data)
            })

            let newVar = require('../youtube.json');
            let {url, title} = newVar;
            songInfo = await ytdl.getInfo(newVar.url)

        } else {
            songInfo = await ytdl.getInfo(args[1]);
        }


        const song = {
            title: songInfo.title,
            url: songInfo.video_url,
        };

Что я пытаюсь сделать,

  • Проверяет, является ли 'суффикс' URL-адресом, и, если нет, запускает суффикс через функцию yts() (yt-search) и получает URL-адрес из возвращаемого объекта.

  • Затем передайте это значение URL через функцию ytdl.getInfo().

  • Работает до определенной степени, но запись в JSON вызывает проблему в том, что он возвращает тот же URL, даже когда новый поиск завершен, до тех пор, пока программа будет перезапущен,

  • Затем он будет повторять процесс с тем значением, которое было сохранено в файле JSON при запуске программы. Тем не менее, я получаю результаты, когда я console.log(videos[0].url), и значение меняется с каждым запросом, но у меня нет возможности передать эти данные за пределы функции yts() без предварительной записи в JSON.

Есть идеи?

Извините, если я не указал c достаточно или запутался в моем понимании, это один из моих первых "сложных" проектов. Возможно также, что проблема существует в другом месте модуля, но из того, что я сделал до сих пор, я думаю, что это где-то в коде, показанном выше. Спасибо!

1 Ответ

0 голосов
/ 26 января 2020

вот что вы можете сделать, чтобы сделать это правильно.

const getSongInfo = (url, suffix) => {
    return new Promise(async (resolve, reject) => {
        let regex = /^https/i;
        let isUrl = regex.test(url);
        if (!isUrl) {
            // netween where is the suffix variable ?
            yts(suffix, async (err, r) => {
                if(err) reject(err);
                const videos = r.videos;
                let data = JSON.stringify(videos[0]);
                // still don't know why bother save it and access it again.
                fs.writeFileSync('youtube.json', data);
                let newVar = require('../youtube.json');
                resolve(await ytdl.getInfo(newVar.url));
            });
        } else {
            resolve(await ytdl.getInfo(args[1]));
        }
    });
}


// hope the outer function is async
let songInfo = await getSongInfo(checkUrl, suffix);

const song = {
    title: songInfo.title,
    url: songInfo.video_url,
};

Между тем обязательно проверьте суффиксную переменную, которая не находится в области действия.

...