Node.js项目中用jQuery发API请求报错TypeError: $.post is not a function如何解决?
解决Node.js中jQuery $.post 不是函数的问题
这个问题我刚接触Node.js时也踩过一模一样的坑,核心原因是:jQuery原本是为浏览器环境设计的,它的Ajax方法(比如$.post)依赖浏览器自带的XMLHttpRequest对象,但Node.js本身并没有这个对象,所以直接require('jquery')后,Ajax相关方法会直接失效。
下面给你两种可行的解决方案:
方案一:用jsdom模拟浏览器环境让jQuery正常运行
如果你一定要坚持用jQuery的语法发起请求,可以借助jsdom库模拟浏览器的window环境,给jQuery补上它需要的依赖:
- 先安装所需依赖:
npm install jquery jsdom
- 修改代码,创建模拟环境后再引入jQuery:
const { JSDOM } = require('jsdom'); // 创建一个空的DOM环境,获取对应的window对象 const { window } = new JSDOM(''); // 把window传给jQuery,让它在模拟的浏览器环境中初始化 const $ = require('jquery')(window); // 现在可以正常使用$.post了 let ticketSales = []; let events = []; $.post("https://ticketsoko.nouveta.co.ke/api/index.php", { TransactionType: "getEvents" }, function (data, status) { var info = JSON.parse(data); for (var i = 0; i < info.data.length; i++) { ticketSales[i] = info.data[i].totalTicketsSalesAmount; events[i] = info.data[i].Events.events_name; console.log(events[i]); } })
方案二:使用Node.js专用的HTTP请求库(更推荐)
其实在Node.js环境里,jQuery的核心价值(DOM操作)根本用不上,单纯用它的Ajax功能有点大材小用。更合适的是用专门的HTTP请求库,比如axios,语法简洁还更符合Node.js的异步编程习惯:
- 安装axios:
npm install axios
- 重写你的请求代码:
const axios = require('axios'); let ticketSales = []; let events = []; axios.post("https://ticketsoko.nouveta.co.ke/api/index.php", { TransactionType: "getEvents" }) .then(response => { // axios会自动解析JSON响应,不需要手动调用JSON.parse const info = response.data; for (let i = 0; i < info.data.length; i++) { ticketSales[i] = info.data[i].totalTicketsSalesAmount; events[i] = info.data[i].Events.events_name; console.log(events[i]); } }) .catch(error => { // 捕获请求过程中的错误,方便调试 console.error('请求失败:', error.message); });
两种方案里更推荐第二种,它更轻量,不需要额外模拟浏览器环境,也是Node.js生态中处理HTTP请求的常规做法。
内容的提问来源于stack exchange,提问作者mots




