3、创建HTTP服务(不使用第三方库)(使用CORS解决跨域问题)_createWebServer
4、node源码利用range头实现Mp4文件流播放(不使用第三方库)_video-stream
5、node大文件分片上传(不使用第三方库)_file-upload
6、node制作formdata数据并保存成文件_zipFile
7、node下载m3u8视频 node合并m3u8视频_nodeM3u8
9、node源码获取MP4时长信息_getMp4Info.js
搭建一个简单的http服务(和https服务)(不使用第三方库)
node控制资源下载速度(不使用第三方库)
node源码利用range头实现断点下载(不使用第三方库)
node源码M3u8流格式文件视频播放(不使用第三方库)
node Gzip压缩传输http服务(不使用第三方库)
有关Stream(流)的应用
--
node文件上传(express,multer)
node文件上传(不使用第三方库)
node文件或文件夹上传(不使用第三方库)
--
nodeRequest请求(不使用第三方库)
node模仿Nginx正向代理(不使用第三方库)
--
node搭建websock服务(不使用第三方库) node搭建RTC音视频服务(不使用第三方库)
--
node进程守护Demo(不使用第三方库) node多进程性能提升(不使用第三方库)
--
整理mysql文档
//进程守护
const fork = require('child_process').fork;
//保存被子进程实例数组
var workers = [];
//这里的被子进程理论上可以无限多
var appsPath = ['./index.js'];
var createWorker = function (appPath) {
//保存fork返回的进程实例
var worker = fork(appPath);
//监听子进程exit事件
worker.on('exit', function () {
console.log('worker:' + worker.pid + 'exited');
delete workers[worker.pid];
createWorker(appPath);
});
workers[worker.pid] = worker;
console.log('Create worker:' + worker.pid);
};
//启动所有子进程
for (var i = appsPath.length - 1; i >= 0; i--) {
createWorker(appsPath[i]);
}
//父进程退出时杀死所有子进程
process.on('exit', function () {
console.log(workers);
for (var pid in workers) {
workers[pid].kill();
}
});-
案例文件:nodeServer1
-
通过 可读流 控制资源传输速度
- 案例文件:videoServerDemo
-
案例文件:uploadFiles
-
使用模块:multer,express
-
案例文件:YUMA_uploadFiles
-
测试结果:
-
.png 正常解析保存
-
.jpg 正常解析保存
-
.mp4 正常解析保存
-
.mp3 正常解析保存
-
.txt 正常解析保存,txt内容有中文也会正常保存
-
.doc 正常解析保存
-
//object类型数据会变成[object object],所以obj在传输前需要先将其转换成字符串
-
//如果普通数据中有中文,则会在接收数据时解析成乱码(已解决)
-
//文件和普通数据一块传输,数据可以过来
-
//文件不和普通数据一块传输,数据也可以过来
-
-
案例文件:YUMA_uploadFolder
-
移动端:chrome浏览器
-
解决问题:解决上一个“源码实现文件上传”的异步问题
-
代理服务器转发请求到服务器
-
案例文件:daili_server.js
- 案例文件:wenjiansaomiao
- 只需配置前端就可以,后端不用配置
<body>
<input type="file" id="files" />
<button type="button">上传文件</button>
<script src="./jquery.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$("button").click(function() {
var files = document.getElementById('files').files;
console.log(files);
if (files.length >= 1) {
var form = new FormData();
form.append("files", files[0]);
//原生ajax实现上传文件显示上传进度--------------------------
var xhr = new XMLHttpRequest();
xhr.open('post', '/api/uploadFiles', true);
xhr.onreadystatechange = function() {
if (this.readyState == 4) {
//console.log(this.responseText);打印上传的数据信息
}
};
//1、progress事件:用来返回进度信息
// 下载的progress事件属于XMLHttpRequest对象//xhr.onprogress=function(){}
// 上传的progress事件属于XMLHttpRequest.upload对象xhr.upload.onprogress=function(){}
//2、load事件:传输成功完成。
//3、abort事件:传输被用户取消。
//4、error事件:传输中出现错误。
//5、loadstart事件:传输开始。
//6、loadEnd事件:传输结束,但是不知道成功还是失败。
//xhr.upload.onprogress要写在xhr.send方法前面,否则event.lengthComputable状态不会改变,只有在最后一次才能获得,也就是100%的时候
xhr.upload.onprogress = function(ev) {
//console.log(ev);//控制台打印
/*progress {
target: XMLHttpRequestUpload,
isTrusted: true,
lengthComputable: true,//这是一个状态,表示发送的长度有了变化,可计算
loaded: 15020, //已上传的数据大小,单位字节B,1024B===1KB
total: 15020,//总大小,单位字节B,
eventPhase: 0,
bubbles: false,
cancelable: false,
defaultPrevented: false,
timeStamp: 1445144855459000,
originalTarget: XMLHttpRequestUpload
}*/
if (ev.lengthComputable) {
var precent = 100 * ev.loaded / ev.total;
console.log(precent);
};
};
xhr.send(form);
//jq,ajax实现上传文件显示上传进度---------------------------
$.ajax({
type: "post",
url: "/api/uploadFiles",
data: form,
contentType: false, //必须false才会自动加上正确的Content-Type
processData: false, //必须false才会避开jQuery对formdata的默认处理
cache: false, //缓存
xhr: function() {
//获取ajaxSettings中的xhr对象,为它的upload属性绑定progress事件的处理函数
myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) { //检查upload属性是否存在
//绑定progress事件的回调函数
myXhr.upload.addEventListener('progress', function(ev) {
if (ev.lengthComputable) {
var precent = 100 * ev.loaded / ev.total;
console.log(precent);
}
}, false);
};
return myXhr; //xhr对象返回给jQuery使用
},
success: function(data) {
console.log(data);
};
});
};
});
</script>
</body>var fs = require("fs");
//读文件
fs.readFile('文件地址', 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
console.log("读取成功!");
});
//写文件
fs.writeFile("文件地址", '要保存的数据', function (err) {
if (err) {
return console.log(err);
}
console.log("保存成功!");
});
//获取文件目录
fs.readdir(path.join(__dirname, "public"),function(err,files){
console.log(files);
});function execute(count){
if(count == length){
return;
}else{
arr[count] = null;
arr[count](++count);
}
}
function fun1(count){
setTimeout(function(){
console.log('fun1')
execute(count);
},1000 * 3)
}
function fun2(count){
setTimeout(function(){
console.log('fun2')
execute(count);
},1000 * 2)
}
function fun3(count){
setTimeout(function(){
console.log('fun3')
execute(count);
},1000 * 1)
}
var arr = [fun1,fun2,fun3];
var length = arr.length;
execute(0)//index.js
//引入 public-function
const { format, md5, sha1, isApple } = require('./public-function');//public-function.js
const crypto = require('crypto');
//暴露一个 md5 方法
exports.md5 = function (s) {
//注意参数需要为string类型,否则会报错
return crypto.createHash('md5').update(String(s)).digest('hex');
}