从另一个函数内部的对象中提取数据而不写入 JSON?
Extracting data from an object inside of another function without writing to JSON?
我正在使用 discord.js 和节点以及一些其他软件包(如 yt-search 和 ytdl-core)编写具有音乐功能的 Discord 机器人。
我要解决的问题与下面的代码有关(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,
};
我想做什么,
是检查'suffix'是否是URL,如果不是,通过yts() (yt-search)
函数检查运行后缀,以及从返回的对象中获取 URL。
然后通过 ytdl.getInfo()
函数传递 url 值。
它在一定程度上按预期工作,但写入 JSON 会导致问题,因为即使完成新搜索,它也会返回相同的 URL , 直到程序重新启动,
然后它将使用程序执行时存储在 JSON 文件中的任何值重复该过程。但是,当我 console.log(videos[0].url)
时我得到了结果,并且值随每个查询而变化,但是我无法在不先写入 JSON 的情况下将该数据传递到 yts()
函数之外.
有什么想法吗?
很抱歉,如果我不够具体,或者我的理解很混乱,这是我的第一个 "complex" 项目。也可能是模块中的其他地方存在问题,但从我目前所做的来看,我认为它在上面显示的代码中的某个地方。谢谢!
这里是您可以做的事情。
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,
};
确保检查不在范围内的后缀变量。
我正在使用 discord.js 和节点以及一些其他软件包(如 yt-search 和 ytdl-core)编写具有音乐功能的 Discord 机器人。
我要解决的问题与下面的代码有关(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,
};
我想做什么,
是检查'suffix'是否是URL,如果不是,通过
yts() (yt-search)
函数检查运行后缀,以及从返回的对象中获取 URL。然后通过
ytdl.getInfo()
函数传递 url 值。它在一定程度上按预期工作,但写入 JSON 会导致问题,因为即使完成新搜索,它也会返回相同的 URL , 直到程序重新启动,
然后它将使用程序执行时存储在 JSON 文件中的任何值重复该过程。但是,当我
console.log(videos[0].url)
时我得到了结果,并且值随每个查询而变化,但是我无法在不先写入 JSON 的情况下将该数据传递到yts()
函数之外.
有什么想法吗?
很抱歉,如果我不够具体,或者我的理解很混乱,这是我的第一个 "complex" 项目。也可能是模块中的其他地方存在问题,但从我目前所做的来看,我认为它在上面显示的代码中的某个地方。谢谢!
这里是您可以做的事情。
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,
};
确保检查不在范围内的后缀变量。