第2章 核心模块的使用

2.1.1 FS模块

node核心模块之一,用于操作文件;

中文手册 : http://nodejs.cn/api/fs.html

  • 文件读写
// 引入模块
var fs = require('fs');
// console.log(typeof fs); //object // 向文件中写入内容
fs.writeFile('./2.1.txt','itcast',function(cb,cb2){// 回调函数 (写入成功后执行的函数)console.log(cb);console.log(cb2);
})// 从文件中读取内容
fs.readFile('./2.1.txt','utf8',function(e,d){// 回调函数 (读取成功后执行的函数)console.log(e);console.log(d);
});
  • 追加内容
// 引入模块
var fs = require('fs');// 向文件中追加内容
fs.readFile('./2.1.txt','utf8',function(e,d){d+='2344';fs.writeFile('./2.1.txt',d,function(e){if(e){console.log('写入失败')}else{console.log('写入成功')}})
});

课堂作业:尝试操作json数据,时间15分钟

var str = [{id:1,names:'路飞',sex:'男',img:''},{id:2,names:'乌索普',sex:'男',img:''},{id:3,names:'娜美',sex:'女',img:''}
]

要求1:将数据转为字符串存入文件 hzw.json

要求2:向 hzw.json 文件中添加一条数据 {id:'4',names:'罗宾',sex:'女',img:''} ;

要求3:删除 hzw.json 文件中 id 值为2的数据

要求4:将 hzw.json 文件中id为3的数据中的names改为 ‘女帝’;

2.1.2 http协议理论

参见http部分课件

2.2 HTTP模块

node核心模块之一,用于搭建HTTP服务器;

中文手册 http://nodejs.cn/api/http.html

2.2.1 开启服务器

// 1. 导入http模块
var http = require('http');// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {console.log(' 请访问http://localhost:8000');
});// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {console.log('服务端收到客户端的请求啦!!!');// 向客户端页面返回字符串response.write("hello node");// 结束响应response.end();
});

因为我们的服务器接受请求处理并响应数据时,并没有指定响应数据的类型,所以出现了乱码;

而在http中,我们可以通过服务器的响应头指定数据类型,在 http.ServerResponse 类 中为我们提供了setHeader 方法:

2.2.2 响应 HTML 页面

但是,我们不能一直将html代码写到服务器的方法中,而是需要建一个xx.html的文件,将html文件中的内容返回给客户端;

2.2.2 .html :

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><h1>你好,我是西岭老湿</h1><h2>另外,我还很帅……</h2>
</body>
</html>

nodejs代码

var http = require('http');
// 1:引入文件操作模块
var fs = require('fs');
var server = http.createServer();
server.on('request', function(request, response) {// 2:读取html文件中的内容fs.readFile('./2.2.2.html','utf8',function(error,html_data){// 设置响应头response.setHeader('Content-Type', 'text/html;charset=utf-8');// 将html中的内容响应回客户端,结束响应response.end(html_data);})
});

2.2.3 响应图片

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><h1>你好,我是西岭老湿</h1><h2>另外,我还很帅……</h2><img src="./img/03.jpg" alt="野生脆脆.jpg">
</body>
</html>
server.on('request', function(request, response) {// url 属性返回请求的URL字符串var urls = request.url;if( urls =='/'){fs.readFile('./2.2.2.html','utf8',function(error,html_data){// 设置响应头response.setHeader('Content-Type', 'text/html;charset=utf-8');// 将html中的内容响应回客户端,结束响应response.end(html_data);})}else if(urls.indexOf('jpg')>=0){ // 判断请求图片fs.readFile('./img/03.jpg',function(error,html_data){response.end(html_data);})}
}

2.2.4 响应其他静态资源

<head><meta charset="UTF-8"><title>Document</title><link rel="stylesheet" href="./public/h.css">
</head>
<body><h1>你好,我是西岭老湿</h1><h2>另外,我还很帅……</h2><img src="./img/03.jpg" alt="野生脆脆.jpg">
</body>
<script src="./public/h.js"></script>
</html>
server.on('request', function(request, response) {// url 属性返回请求的URL字符串var urls = request.url;if( urls =='/'){fs.readFile('./2.2.2.html','utf8',function(error,html_data){// 设置响应头response.setHeader('Content-Type', 'text/html;charset=utf-8');// 将html中的内容响应回客户端,结束响应response.end(html_data);})}else{fs.readFile('.'+urls,function(error,html_data){response.end(html_data);})}
});

2.3 服务器遍历文件及文件夹-案例

模仿Apache服务器,遍历文件及文件,显示时间及大小;

右键另存为,下载页面当作静态页面模板使用;

使用node载入静态页面:

使用ajax技术在页面中发送请求到后台,apache.html

<script>var xhr = new XMLHttpRequest();xhr.onreadystatechange=function(){if(this.readyState == 4){console.log(this.responseText);}}xhr.open('get','/file_list');xhr.send();
</script>

node:

server.on('request', function(request, response) {// url 属性返回请求的URL字符串var urls = request.url;if( urls =='/'){fs.readFile('./apache.html','utf8',function(error,html_data){// 设置响应头response.setHeader('Content-Type', 'text/html;charset=utf-8');// 将html中的内容响应回客户端,结束响应response.end(html_data);})}else if(urls == '/file_list'){fs.readdir('./','utf8',function(err,files){response.end(JSON.stringify(files));});}else{fs.readFile('.'+urls,function(error,html_data){response.end(html_data);})}
});

apache.html --> ajax

xhr.onreadystatechange=function(){if(this.readyState == 4){var data = JSON.parse(this.responseText);var htmls = '';for(var i = 0;i<data.length;i++){htmls+='<tr><td valign="top">';htmls+= '<img src="./img/layout.gif" alt="[   ]"></td>';htmls+='<td><a href="http://localhost/%e7%ac%94%e8%ae%b0-01.pdf">';htmls+= data[i]+'</a> </td>';htmls+= '<td align="right">2018-04-26 10:31 </td>';htmls+= '<td align="right">3.2M</td><td>&nbsp;</td></tr>';}var tb = document.getElementsByTagName('tbody')[0];tb.innerHTML+=htmls;}
}

2.4 动态展示文件的其他属性

获取文件的其他属性:

var fs = require('fs');
fs.readdir('./','utf8',function(err,files){fs.stat(files[0],function(er,st){console.log(st.mtime);console.log(st.size);console.log(st.isFile());})
});

修改node代码

server.on('request', function (request, response) {// url 属性返回请求的URL字符串var urls = request.url;if (urls == '/') {fs.readFile('./apache.html', 'utf8', function (error, html_data) {// 设置响应头response.setHeader('Content-Type', 'text/html;charset=utf-8');// 将html中的内容响应回客户端,结束响应response.end(html_data);})} else if (urls == '/file_list') {fs.readdir('./', 'utf8', function (err, files) {// response.end(JSON.stringify(files));var file_obj = [];//  判断条件:声明一个变量,这个变量用来记录两个数据的中数据的长度var count = 0;for (var i = 0; i < files.length; i++) {file_obj[i] = {};// 利用自调用匿名函数,保留i的变量值(function (i) {fs.stat(files[i], function (er, st) {count ++;file_obj[i].name = files[i];if(st.isFile()){file_obj[i].type = 'file';}else{file_obj[i].type = 'dir';}file_obj[i].mtime = st.mtime;file_obj[i].size = st.size;// 当读取的文件个数与所有文件个数相等时if(count == files.length){response.end(JSON.stringify(file_obj));}})// console.log(file_obj);})(i);// console.log(files[i]);}});} else {fs.readFile('.' + urls, function (error, html_data) {response.end(html_data);})}
});

修改 ajax代码

var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function(){if(this.readyState == 4){var data = JSON.parse(this.responseText);var htmls = '';for(var i = 0;i<data.length;i++){htmls+='<tr><td valign="top">';if(data[i].type == 'file'){htmls+= '<img src="./img/layout.gif" alt="[   ]"></td>';}else{htmls+= '<img src="./img/folder.gif" alt="[   ]"></td>';}htmls+='<td><a href="">';htmls+= data[i].name+'</a> </td>';htmls+= '<td align="right">'+ data[i].mtime +'</td>';htmls+= '<td align="right">'+ data[i].size +'</td><td>&nbsp;</td></tr>';}var tb = document.getElementsByTagName('tbody')[0];tb.innerHTML+=htmls;}
}
xhr.open('get','/file_list');
xhr.send();

循环后 i 丢失的问题:


// var arr = ['a', 'b', 'c'];
// for (var i = 0; i < arr.length; i++) {//     // 模拟延迟
//     setTimeout(function () {//         console.log(arr[i]);
//     }, 1000);
// }/** ******************************************** 上面的代码 全部输出 undefined* ********************************************/ var arr = ['a','b','c'];
for(var i = 0; i < arr.length; i ++) {(function(i){// 模拟延迟setTimeout(function() {console.log(arr[i]);}, 1000);})(i);
}

解决方案2: 直接使用count 记录

var fs = require('fs');fs.readdir('./', 'utf8', function (err, files) {// console.log(files);var count = 0;var arr = []for (var i = 0; i < files.length; i++) {fs.stat(files[i], 'utf8', function (err, stats) {// 在回调中声明对象var obj = {};// console.log(i);obj.size = stats.sizeobj.mtime = stats.mtime// 不在使用i变量,因为循环结束i 就会消失// 但是count 不会obj.name = files[count];// 将对象的数据存入数组arr.push(obj);// console.log(arr);// 自增count 下次使用count++;// console.log(obj);if (files.length == count) {console.log(arr);}})}
})

前端基础-Node.js核心模块的使用相关推荐

  1. (14)Node.js 核心模块—http

    一.核心模块 - http模块介绍 • http 模块可以发布 web 服务,在没有学习http模块之前,我们都是用tomcat,nginx等服务器. • 使用之前,通过 require 引入 • 官 ...

  2. (10)Node.js核心模块—fs文件系统之目录操作

    一.创建目录 // 引入fs模块 const fs = require('fs') //创建目录(文件夹) //语法:fs.mkdir('目录路径',回调函数) fs.mkdir('./d1', (e ...

  3. (12)Node.js核心模块fs—实现文件复制和压缩

    一.文件复制 将src目录下的style.css文件复制一份,到dist目录下. 二.文件压缩 文件压缩就是把我们书写的代码中的空格和注释进行删除,这样我们体积会变小,当我们上线到服务器时,给服务器造 ...

  4. (11)Node.js 核心模块fs – 同步函数( synchronization )

    一.介绍图 再执行程序1时,把1.1和1.2丢到事件队列中,去异步执行,这样提高了效率,让执行速度更快. 如果使用同步,需要等待程序1完全执行完成后,才能去执行程序2. 二.同步函数 • 在主程序中自 ...

  5. 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js

    20年Nodejs教程零基础入门到项目实战前端视频教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务 ...

  6. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  7. Rust: 基于 napi-rs 开发 Node.js 原生模块

    Rust: 基于 napi-rs 开发 Node.js 原生模块 文章目录 Rust: 基于 napi-rs 开发 Node.js 原生模块 完整代码示例 背景 & napi 环境/工具链准备 ...

  8. Node.js核心入门(二)

    目录: Node.js核心入门(一) 全局对象 常用工具 事件机制 Node.js核心入门(二) 文件系统访问 HTTP服务器与客户端 文件系统 fs fs 模块是文件操作的封装,它提供了文件的读取. ...

  9. Node.js:模块查找,引用及缓存机制

    1. Node.js的模块载入方式与机制 Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的 ...

最新文章

  1. 研究生扩招20.74%!教育部公布重要数据
  2. 调整php-fpm,nginx调整php-fpm
  3. 顶级生物信息学 RSS 订阅源
  4. Java工程师的成长路线图是什么?
  5. oracle视图执行脚本,oracle 视图,函数,过程,触发器自动编译脚本
  6. spring 框架-java配置163邮件服务器,发送邮件
  7. hdu 1863(最小生成树kruskal)
  8. 使用@Rule在JUnit中测试文件和目录
  9. c#自定义事件的使用方法
  10. msp单片机UCS配置
  11. python死锁案例_Python 多线程死锁
  12. java html2text_将HTML转化为TEXT的Java类
  13. 服务器密码过期了咋修改,重置已过期的密码 (Sun Java System Directory Server Enterprise Edition 6.3 管理指南)...
  14. 《人件》(Peopleware)文摘
  15. 怎样去除抖音短视频的水印,快速去除视频水印的方法
  16. Android摇一摇领红包
  17. redmibook螃蟹网卡信号差问题
  18. 智能体:华为给时代炼一炉钢
  19. 今日头条各种套路玩法
  20. 苹果id可以彻底注销吗_怎么注销淘宝账号?淘宝账号注销后可以重新注册吗?...

热门文章

  1. 怎样将cad布局导出来_CAD如何将布局里面的内容输出为 *.dwg文件? | 怎么把cad 中的数据输出...
  2. 2022-2028全球小型建筑设备行业调研及趋势分析报告
  3. 基于深度学习的视觉三维重建研究总结2进阶
  4. 苏黎世联邦理工学院 计算机视觉,瑞士苏黎世联邦理工学院计算机视觉实验室进行合作...
  5. 全球与中国小龙虾市场深度研究分析报告
  6. SAP QM初阶之事务代码QC51为采购订单创建Quality Certificate
  7. 部署Kubernetes kube-apiserver启动失败
  8. 十位世界级顶尖投资大师的投资哲学:忍耐、聚焦、坚定
  9. 如何设置Raspberry Pi Zero进行旅行
  10. 信锐无线控制器短信认证企信通配置