如何将Puppeteer获取的变量全局化?Discord.js变量未定义问题
问题分析与解决
1. 语法错误导致的“变量未定义”假象
你的代码中setDescription的字符串未正确闭合反引号,这会触发JavaScript语法解析错误,错误提示可能指向附近的data变量,造成“data未定义”的误解:
// 错误写法:缺少闭合反引号 .setDescription('Ai cerut rezolvarea problemei: `' + `${args[0]}`) // 正确写法:补充闭合反引号 .setDescription('Ai cerut rezolvarea problemei: `' + `${args[0]}` + '`')
2. 数据处理错误
data是page.evaluate返回的数组,每个元素是包含codul字段的对象,直接用${data}会输出[object Object],无法正确显示代码内容。需要提取数组中元素的codul值:
// 若仅需第一个结果的代码 { name: 'Code', value: data[0]?.codul || '暂无代码', inline: true } // 若有多个结果,用换行拼接 { name: 'Code', value: data.map(item => item.codul).join('\n') || '暂无代码', inline: false }
3. 搜索关键词的错误
你在page.type中写死了字符串PROBLEMA,而非使用变量值,导致搜索固定文本而非用户输入的问题编号:
// 错误写法 await page.type('input[name=s]', `PROBLEMA`) // 正确写法 await page.type('input[name=s]', PROBLEMA)
修正后的完整代码片段
async function foo() { try { const browser = await puppeteer.launch() const URL = 'https://tutoriale-pe.net/rezolvari-pbinfo/' const PROBLEMA = `${args[0]}` const page = await browser.newPage() const navigationPromise = page.waitForNavigation({waitUntil: "domcontentloaded"}) await page.goto(URL) await navigationPromise; await page.waitForSelector('input[name=s]') // 修正搜索关键词 await page.type('input[name=s]', PROBLEMA) await page.keyboard.press('Enter') await page.click('.penci-image-holder.penci-lazy') await page.waitForSelector('.enlighter') await page.click('.enlighter') await page.waitForSelector('.enlighter-btn-raw') await page.click('.enlighter-btn-raw') let data = await page.evaluate(() => { let results = [] let contents = document.querySelectorAll('#penci-post-entry-inner') contents.forEach((optiune) => { results.push({ codul: optiune.querySelector('.enlighter-raw').innerText, }) }) return results; }) console.log(data); const embed = new Discord.EmbedBuilder() .setColor('#FFD700') // 修正反引号闭合 .setDescription('Ai cerut rezolvarea problemei: `' + `${args[0]}` + '`') .addFields( // 修正数据提取方式 { name: 'Code', value: data[0]?.codul || '未找到代码内容', inline: false}, ) .setTimestamp() message.channel.send({ embeds: [embed] }); await browser.close() } catch(e) { console.log(e); message.channel.send('Problema `' + `${args[0]}` + '` nu exista.'); } } foo();
关于变量全局化的问题
你不需要将data全局化,它在try块的作用域内已可被后续的Embed代码访问。当前问题核心是语法错误和数据处理方式错误,而非作用域问题。
内容的提问来源于stack exchange,提问作者bogdan
相关产品推荐
相关产品推荐

