Discord.js机器人使用node-fetch时无法识别fetch函数求助
问题描述
我用Discord.js开发机器人,其中一个斜杠命令用于爬取网页,目的是告知用户喜爱平台的最新发布内容。导入node-fetch后出现“fetch函数不存在”的错误,代码作为独立脚本运行正常,但在Discord机器人环境中无法工作。
解决方案
这个问题核心是node-fetch版本的导入方式不兼容,不同版本的node-fetch导出逻辑有差异,Discord机器人的运行环境和你测试独立脚本的环境依赖版本可能不一致。
1. 调整node-fetch的导入方式
- 若安装的是node-fetch v2版本(CommonJS导出),直接导入整个模块即可,不要解构fetch:
// 替换原导入行 const fetch = require("node-fetch");
- 若安装的是node-fetch v3+版本(默认ES模块),Discord.js的CommonJS项目可能不兼容,最稳妥的方式是降级到v2:
npm uninstall node-fetch npm install node-fetch@2
2. 修正后的完整代码
const { load } = require("cheerio"); const fetch = require("node-fetch"); const fs = require("fs"); const { SlashCommandBuilder } = require("discord.js"); // 补充缺失的导入 module.exports = { data: new SlashCommandBuilder() .setName("questnew") .setDescription("Get Quest releases!"), async execute(interaction, client) { try { const siteUrl = "http://www.vrdb.app/"; const response = await fetch(siteUrl); const body = await response.text(); const games = []; const $ = load(body); const elSelector = "#oculus-statistics > tbody > tr"; $(elSelector).each((parentIdx, parentEl) => { if (parentIdx >= 0 && parentIdx <= 4) { $(parentEl) .children() .each((childIdx, childEl) => { if (childIdx === 0) { games.push($(childEl).text().trim()); } }); } }); await interaction.reply({ content: `最新Quest发布内容:\n${games.join("\n")}`, ephemeral: true, }); } catch (error) { await interaction.reply({ content: `执行命令时出错:${error.message}`, ephemeral: true, }); } }, };
3. 额外注意事项
- 原代码未导入
SlashCommandBuilder,这会导致new SlashCommandBuilder()报错,必须补充该导入语句。 - 确保机器人运行的Node.js版本符合node-fetch要求:v2支持Node.js 10+,v3需要Node.js 16+。
内容的提问来源于stack exchange,提问作者Mikaël Dufresne
相关产品推荐
相关产品推荐

