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);