为何无法导入jQuery?jsdom模块找不到问题求助
问题解决:找不到jsdom模块及替代请求方案
一、解决"Cannot find module 'jsdom'"的可能原因及步骤
- 确认依赖已安装:尽管package.json中声明了jsdom,但可能未实际完成安装。执行
npm install(或yarn install)重新安装所有依赖,确保node_modules目录下存在jsdom文件夹。 - 检查Node.js版本:jsdom 20.x版本要求Node.js 16.14.0或更高版本。运行
node -v查看当前版本,若版本过低,可选择升级Node.js,或把package.json中的jsdom版本降级到兼容旧Node的版本(比如^19.x)。 - 清理缓存并重装:若之前安装出现缓存异常,删除node_modules文件夹和package-lock.json(或yarn.lock),再重新执行安装命令。
- 确认文件目录:确保代码文件与package.json在同一根目录下,避免Node.js无法定位node_modules中的模块。
二、更适合Node.js的请求方式:放弃jQuery Ajax
jQuery是浏览器端库,其Ajax依赖浏览器的XMLHttpRequest对象,在Node.js中需模拟DOM环境(如jsdom)才能运行,既繁琐又冗余。推荐直接使用Node.js生态中的HTTP请求库,比如axios或node-fetch,示例如下:
方案1:使用axios
- 安装axios:
npm install axios
- 替换请求代码:
const axios = require('axios'); const { EmbedBuilder } = require('discord.js'); const limit = 1; axios.get(`https://api.api-ninjas.com/v1/facts?limit=${limit}`, { headers: { 'X-Api-Key': 'MY-API-KEY', 'Content-Type': 'application/json' } }) .then(result => { // API返回包含fact字段的数组,取第一个元素的fact值 const fact = result.data[0].fact; console.log(fact); interaction.reply({ embeds: [ new EmbedBuilder() .setTitle(`Random fact for @<${interaction.user.id}>`) .setAuthor({ name: 'vixitu', iconURL: 'https://external-preview.redd.it/lqDFDXXvfqMs7kyQ9y1FrGcQzdCE23uMPlcxFqo_oYE.png?width=640&crop=smart&auto=webp&s=1aad996b62437feb367356c6bed434385bda0699' }) .setDescription("Here is your random fact.") .setThumbnail('https://external-preview.redd.it/lqDFDXXvfqMs7kyQ9y1FrGcQzdCE23uMPlcxFqo_oYE.png?width=640&crop=smart&auto=webp&s=1aad996b62437feb367356c6bed434385bda0699') .addFields({ name: 'Random fact #1', value: fact }) .setTimestamp() ] }); }) .catch(error => { console.error('Error:', error.response?.data || error.message); });
方案2:使用node-fetch
- Node.js 18及以上版本自带fetch API,无需安装;若使用低版本Node,需安装
node-fetch@2:
npm install node-fetch@2
- 请求代码:
const fetch = require('node-fetch'); const { EmbedBuilder } = require('discord.js'); const limit = 1; fetch(`https://api.api-ninjas.com/v1/facts?limit=${limit}`, { method: 'GET', headers: { 'X-Api-Key': 'MY-API-KEY', 'Content-Type': 'application/json' } }) .then(response => response.json()) .then(result => { const fact = result[0].fact; console.log(fact); interaction.reply({ embeds: [ new EmbedBuilder() .setTitle(`Random fact for @<${interaction.user.id}>`) .setAuthor({ name: 'vixitu', iconURL: 'https://external-preview.redd.it/lqDFDXXvfqMs7kyQ9y1FrGcQzdCE23uMPlcxFqo_oYE.png?width=640&crop=smart&auto=webp&s=1aad996b62437feb367356c6bed434385bda0699' }) .setDescription("Here is your random fact.") .setThumbnail('https://external-preview.redd.it/lqDFDXXvfqMs7kyQ9y1FrGcQzdCE23uMPlcxFqo_oYE.png?width=640&crop=smart&auto=webp&s=1aad996b62437feb367356c6bed434385bda0699') .addFields({ name: 'Random fact #1', value: fact }) .setTimestamp() ] }); }) .catch(error => { console.error('Error:', error.message); });
注:API返回的是数组格式,每个元素包含fact字段,需取result[0].fact作为事实内容,而非直接使用result。
内容的提问来源于stack exchange,提问作者vixitu
相关产品推荐
相关产品推荐

