You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:20:30