在 Node.js 中使用 axios 配置代理并实现图片并发下载

文章目录

      • 一、创建 Axios 实例
      • 二、图片并发下载
      • 三、参考资料

一、创建 Axios 实例

可以创建一个 axiosConfig.ts 文件用于创建和更新相关实例:

// server/utils/axiosConfig.ts
const axios = require("axios");
const { HttpsProxyAgent } = require('https-proxy-agent');// axios 实例
let axiosInstance = null;// 代理表单(可以从数据库读取相关配置)
let proxyParams = { state: true, host: "127.0.0.1", port: 10809, protocol: "http", username: "", password: ""
};// 创建 axios 实例 
const createAxiosInstance = () =>  {// 判断是否开启代理const useProxy = proxyParams['state'] == true;let axiosConfig = {timeout: 5000};// 启用代理服务if (useProxy && proxyParams) {const agent = new HttpsProxyAgent({host: proxyParams.host,port: proxyParams.port,protocol: proxyParams.protocol,});axiosConfig['httpsAgent'] = agent;}// 代理服务器 用户名、密码if (useProxy && proxyParams['username'] && proxyParams['password']) {axiosConfig['auth'] = {username: proxyParams['username'],password: proxyParams['password']};}axiosInstance = axios.create(axiosConfig);
}// 获取 Axios 实例
const getAxiosInstance = () => {if (!axiosInstance) {createAxiosInstance();}return axiosInstance;
}// 更新 Axios 实例
const updateAxiosInstance = () => {createAxiosInstance();
}module.exports = {getAxiosInstance,updateAxiosInstance
};

代理相关配置可以以字符串的方式先存储在数据库中,再根据需要读取和修改以实现动态更新代理配置:

const { getSettingCache } = require("../db/SettingManager.ts");const createAxiosInstance = () => {// 获取配置信息const settingCache = getSettingCache();// 判断是否开启代理const proxyParams = settingCache["proxy"] ? JSON.parse(settingCache["proxy"]) : null;// {//   proxy: '{"state":true,"host":"127.0.0.1","port":10809,"protocol":"http","username":"","password":""}',// }
}

二、图片并发下载

此处使用 p-limit 来控制并发数量:

yarn add p-limit

创建一个 downloadImages.ts 文件用来处理图片下载相关方法:

// server/utils/downloadImages.ts
const { getAxiosInstance } = require('../utils/axiosConfig.ts');
const path = require("path");
const fs = require("fs");const downloadImagesByUrls = async (imageUrls, savePath) => {// 为避免出现循环导入,此处使用动态导入const pLimit = (await import('p-limit')).default;// 提取 url 中的文件名 例:xxx.jpgconst filenames = imageUrls.map((url) => path.basename(url));// 判断是否存在目标文件夹,不存在则创建if (!fs.existsSync(savePath)) {fs.mkdirSync(savePath, { recursive: true });}// 下载单个图片的函数const downloadImage = async (url, filename) => {// 拼接文件路径const fullPath = path.join(savePath, filename);try {// 获取 axios 实例const axiosInstance = await getAxiosInstance();const response = await axiosInstance({method: "get",url: url,responseType: "stream",});const writer = await fs.createWriteStream(fullPath);// 用Promise包装stream完成事件return new Promise((resolve, reject) => {response.data.pipe(writer);writer.on("finish", () => resolve({ filename, success: true }));writer.on("error", (err) => reject({ filename, success: false, error: err.message }));response.data.on("error", (err) => reject({ filename, success: false, error: err.message }));});} catch (error) {return { filename, success: false, error: error.message };}};// 并发控制const limit = pLimit(5);// 创建下载任务const tasks = imageUrls.map((url, index) => limit(() => downloadImage(url, filenames[index])));// 执行下载任务并等待所有任务完成const results = await Promise.all(tasks);return results;
};module.exports = {downloadImagesByUrls,
};

代码说明: 该方法可直接复制使用,需要传递两个参数,imageUrls 参数为需要下载的图片列表,是一个存储了图片下载链接的数组,例:['http://xxx','http://xxx'],第二个参数是 savePath ,即文件保存路径,例:D:/Desktop,函数会提取文件名称进行路径的拼接,如果路径不存在则会自动创建。

三、参考资料

  • https://www.npmjs.com/package/p-limit
  • https://www.bright.cn/blog/how-tos/axios-proxy
  • https://www.jianshu.com/p/8021d8851775

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.lang.IllegalArgumentException: Illegal character in path at index 40解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

K最近邻(K-Nearest Neighbors, KNN)

K最近邻(K-Nearest Neighbors, KNN)理论知识推导 KNN算法是一个简单且直观的分类和回归方法,其基本思想是:给定一个样本点,找到训练集中与其最近的K个样本点,根据这些样本点的类别(分类问题&am…

Ubuntu 22.04.4 LTS (linux) 安装iftop 监控网卡流量 软件

1 安装iftop sudo apt update sudo apt-get install iftop 2 监控网卡 sudo iftop -i eth0 -n -p 界面最上面&#xff0c;显示的是类似刻度尺的刻度范围&#xff0c;显示流量图形的长条作标尺用的。 中间的< >这两个左右箭头&#xff0c;表示的是流量的进出方向.TX&…

PTA - 嵌套列表求和

使用递归函数对嵌套列表求和 函数接口定义&#xff1a; def sumtree(L) L是输入的嵌套列表。 裁判测试程序样例&#xff1a; /* 请在这里填写答案 */L eval(input()) print(sumtree(L)) # 调用函数 输入样例&#xff1a; 在这里给出一组输入。例如&#xff1a; [1,[2…

邮件飞鸿:深入解析Laravel的邮件系统

邮件飞鸿&#xff1a;深入解析Laravel的邮件系统 在现代Web应用中&#xff0c;邮件服务是与用户交互的重要方式之一。Laravel&#xff0c;作为PHP界的流行框架&#xff0c;提供了一个强大而灵活的邮件系统。本文将深入探讨Laravel的邮件系统如何工作&#xff0c;并通过代码示例…

轻断食1.0.1-july 16th 冥想1.1.1

自己昨天晚上吃了豆皮以后&#xff0c;自己感觉自己还是很饿&#xff0c;然后随即自己又吃了一些东西&#xff08;其实自己可以控制的&#xff0c;但是没有办法&#xff0c;你不知道那种感觉&#xff1a;有一只该死的蚊子&#xff0c;老在自己的耳朵旁边嗡嗡乱飞。&#xff09;…

Python中的sorted()与list.sort():深入解析它们的效率差异

目录 Python中的sorted()与list.sort()&#xff1a;深入解析它们的效率差异内部实现与原理sorted()list.sort() 性能与内存使用内存消耗执行速度适用场景sorted()list.sort() 实例对比结论 Python中的sorted()与list.sort()&#xff1a;深入解析它们的效率差异 在Python编程中…

【Vue随笔】Vue中watch的不同写法

【写在前面】在实际开发中&#xff0c;我们要监听的属性可能是对象中的某个属性&#xff0c;除了对整个对象进行监听以外&#xff0c;我们可以用单引号包裹的形式监听对象中的某个属性。 watch: {searchFormModel.appKey: function (newVal) {if (newVal.includes(全部)) {if (…

昇思25天学习打卡营第23天|基于MindSpore的GPT2文本摘要

这节课主要学习基于MindSpore的GPT2文本摘要。主要包括环境安装、数据集加载与处理、模型构建、模型训练、模型推理五部分内容。 1.首先介绍环境安装 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面…

go 编译ollama的时候报错:open /dev/null: no such file or directory

go 编译ollama的时候报错&#xff1a;open /dev/null: no such file or directory github.com/xtgo/set: /root/work/go/pkg/tool/linux_amd64/compile: open /dev/null: no such file or directory gonum.org/v1/gonum/blas/gonum: /root/work/go/pkg/tool/linux_amd64/compi…

Spark中的JOIN机制

Spark中的JOIN机制 1、Hash Join概述2、影响JOIN的因素3、Spark中的JOIN策略3.1、Shuffle Hash Join3.2、Broadcast Hash Join3.3、Sort Merge Join3.4、Cartesian Product Join2.5、Broadcast Nested Loop Join1、Hash Join概述 Apache Spark共提供了五种JOIN机制,其中常用的…

Laravel Horizon:任务队列的智能指挥官

Laravel Horizon&#xff1a;任务队列的智能指挥官 在现代Web应用中&#xff0c;处理耗时的任务通常需要异步执行&#xff0c;以避免阻塞主线程和影响用户体验。Laravel的Horizon任务系统是一个强大的后台工作管理器&#xff0c;它不仅优化了队列任务的处理&#xff0c;还提供…

【论文阅读】MCTformer+:弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器一、介绍1.1 WSSS背景1.2 WSSS策略 二、联系工作2.1 弱监督语义分割2.2 transformers的可视化应用 三、MULTI-CLASS TOKEN TRANSFORMER3.1 Multi-class t…

读人工智能全传15意向立场

1. 物理立场 1.1. 可以解释一个实体行为 1.2. 在物理立场中&#xff0c;我们使用自然法则(物理、化学等)来预测系统的行为结果 1.3. 虽然物理立场在解释这种行为的时候非常有效&#xff0c;但无法应用于理解或者预测人类行为 1.3.1. …

java基础学习:序列化之 - hessian2

文章目录 一、介绍二、主要特点三、应用场景四、使用方式五、与其他序列化协议的比较六、总结 一、介绍 Hessian2是Hessian协议的一个更新版本&#xff0c;由Caucho Technology公司开发。Hessian是一种基于二进制的轻量级、高效的跨语言序列化协议。Hessian2相较于原始Hessian…

迭代器+反向迭代器

接上节内容&#xff0c;反向迭代器&#xff08;aoto的价值显示的更明显&#xff09; int main() {string s1("hello world");//string::reverse_iterator rit s1.rbegin();auto rit s1.rbegin();while (rit ! s1.rend()){(*rit) 3;cout << *rit << &…

解决 Vscode不支持c++11的语法

问题&#xff1a; 解决方案&#xff1a; 1、按 CtrlShiftP 调出命令面板&#xff0c;输入 C/C: Edit Configurations (UI) 并选择它。这将打开 C/C 配置界面 2、打开 c_cpp_properties.json 文件 3、编辑 c_cpp_properties.json 4、保存 c_cpp_properties.json 文件。 关闭并…

软设之模板方法模式

设计模式中模板方法模式的意图是:定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。 打个比方&#xff0c;比如要制作蛋糕&#xff0c;有准备材料&#xff0c;搅拌材料&#xff0c…

防火墙---带宽管理

防火墙的带宽管理&#xff1a;是指对防火墙设备的带宽进行管理和控制&#xff0c;以确保网络流量的合理分配和优化网络性能 带宽管理&#xff1a;是指限制网络流量的速率或控制网络流量的优先级&#xff0c;以确保网络的性能和可用性 核心&#xff1a; 带宽限制&#xff1a;…

在ArcGIS Pro中新建空图层的最快方法

01常规方法 一般情况下&#xff0c;如果我们想新建一个要素图层&#xff0c;常规方法是&#xff1a; 在目录框中&#xff0c;找一个gdb数据库&#xff0c;右键——新建——要素类&#xff1a; 设置好各种属性&#xff1a; 创建结果如下&#xff1a; 最后将要素类拖入地图中即…