当前位置: 代码网 > it编程>前端脚本>Node.js > 如何在 Node.js 中使用 axios 配置代理并实现图片并发下载

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

2024年09月12日 Node.js 我要评论
一、创建 axios 实例可以创建一个 axiosconfig.ts 文件用于创建和更新相关实例:// server/utils/axiosconfig.tsconst axios = require

一、创建 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.jpg
    const 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

到此这篇关于在 node.js 中使用 axios 配置代理并实现图片并发下载的文章就介绍到这了,更多相关node.js axios 图片并发下载内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com