nodejs 高级教程

1. node 处理windows和mac的平台兼容问题

     1. 兼容环境变量

     2. windows不支持&,并行执行npm-script用npm-run-all

     3. 异步同步化:uti l.promisify + async/await

     4. 建议用fs-extra替代fs.readFileSync

     5. 路径标志windows\,Unix /

2. node处理IP封锁

    通过自动随机切换IP代理池绕过封锁

    node实现代理代码:

   http.createServer((req, res)=>{
      request(
        `http://xxx/${req.url}`,
        { proxy: "xxx.xxx.xxx:xxx" },
        function(error, response, body) {
          if (!error && response.statusCode == 200) {
            res.end(body);
          } else {
            console.log(error);
          }
        }
      );
    }).listen(8888,()=>{
        console.log('run')
    });

3.node将base64转换成png

    const fs = require('fs');
    const path = 'xxx/'+ Date.now() +'.png';
    const base64 = data.replace(/^data:image\/\w+;base64,/, "");//去掉图片base64码前面部分data:image/png;base64
    const dataBuffer = new Buffer(base64, 'base64'); //把base64码转成buffer对象,
    fs.writeFile(path, dataBuffer, function(err){//用fs写入文件
        if(err){
            console.log(err);
        }else{
            console.log('写入成功!');
        }
    })

4. node将png转换成base64

    const fs = require("fs");
    const util = require("util");
    const imageData = await util.promisify(fs.readFileSync(fileUrl)); // 例:xxx/xx/xx.png
    const imageBase64 = imageData.toString("base64");
    const imagePrefix = "data:image/png;base64,";
    console.log(imagePrefix + imageBase64);

 5. node实现内网穿透

       1. 内网穿透客户端

const net = require('net');
// 配置
const CONFIG = {
     //一些配置....
};
// 用于校验请求的code
let CODE;
// 创建用于连接校验服务端的 客户端连接
let linkClient = net.createConnection({ port: CONFIG.server_port, host: CONFIG.server_addr }, () => {
    // 创建用于校验请求的code
    CODE = (+new Date());
    // 发送数据校验
    linkClient.write(JSON.stringify({ token: CONFIG.token, code: CODE, type: 'register', binds: CONFIG.binds }));
    console.log(`[${(new Date()).toLocaleString()}] 正在尝试连接...`);
});
linkClient.setTimeout(CONFIG.timeout);
linkClient.on('data', (data) => {
    try {
        data = JSON.parse(data);
        // 校验请求
        if (data.code == CODE) {
            if (data.type == 'register') {
                console.log(`[${(new Date()).toLocaleString()}] 已连接到服务器 ${CONFIG.server_addr}:${CONFIG.server_port}`);
            } else {
                // ....   
            }
            return;
        }
    } catch (error) {
        // 异常
    }
    return linkClient.end();
});
linkClient.on('error', (err) => { 
});
linkClient.on('end', () => { 
}); 

     2. 内网穿透服务端

const net = require('net');
// 配置
const CONFIG = {
     //...
};
// 客户端链接集
let linkClients = {};
// 客户端绑定的应用
let clientBings = {};
// 连接记录
let socketRecords = {}; 
// 远程监听访问 用于穿透
const listenServer = net.createServer((socket) => {
    let id = [socket.remoteAddress, socket.remoteFamily, socket.remotePort].join("_");
    console.log(`[${(new Date()).toLocaleString()}] ${socket.remoteAddress}:${socket.remotePort} 上线...`);
    if (!linkClients[id]) {
        // 保存连接
        linkClients[id] = socket;
        socket.on('data', (data) => {
            try {
                data = JSON.parse(data);
                let [token, type, code, binds] = [data.token, data.type, data.code, data.binds];
                if (token != token) return socket.end();
                if (type == 'register') {// 客户端注册
                    for (let k in binds) {
                        let d = binds[k];
                        if (!clientBings[k]) {
                            [d.code, d.name, d.linkSocket, d.linkId] = [data.code, k, socket, id];
                            //d.forwardServer = createForwardServer(d);//绑定客户端App对应服务端开放的端口服务
                            clientBings[k] = d;
                        }
                    }
                    return socket.write(JSON.stringify({ code: code, type: type, id: id }));
                }  
            } catch (error) {
                // 
                removeInfo(id);
            }
            socket.end();
        });
        socket.on('error', (err) => {
        })
        socket.on('end', (data) => {
        });
    }
});
// 启动服务端监听
listenServer.listen(CONFIG.server_port, CONFIG.server_addr);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值