Node.js的定义
- Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。
- 浏览器是JS的一个前端运行环境,Node.js是JS的后端运行环境。
- NodeJS中没有DOM,也没有BOM,也没有window对象。
fs模块异步读取文件
同步与异步的概念理解
- 同步:多个功能按先后顺序执行,后面任务等待前面任务执行完毕后才会执行。
- 异步:和同步相反,也就是在发出一个功能调用时,不管有没有得到结果,都会继续往下执行。
- 异步的表现形式:以一个回调函数的方式来实现异步任务的执行。
fs.readFile异步读取文件基本写法
语法:fs.readFile(path[, options], callback)
- path, 读取文件的路径。(相对路径或绝对路径)
- options:读取文件的参数配置,通常用一个utf8字符串表示。
- callback:读取完毕的回调函数(err,data) => {}
- 读取文本内容的文件加utf8 读取非文本内容的文件(例如图片)不加utf8
(err,data)=>{ } 中有两个参数
- err 代表读取文件出错后的错误对象,如果文件读取成功err的值为null。
- data 代表读取文件成功后的内容,如果读取失败data的值为undefined。
- 如果err参数的值为null则表示读取文件成功,此时data中存储的就是读取到文件的内容。
fs.readFileSync同步读取文件内容
语法:let res = fs.readFileSync(path[, options])
- path, 读取文件的路径。(相对路径或绝对路径)
- options:读取文件的参数配置,通常用一个utf8字符串表示即可
同步读取文件处理错误
- try{}catch{} 处理同步读取文件的错误。
- try{放有可能出错的代码}
- catch(error){报错后执行的代码,catch结构会捕获到错误}
fs.writeFileSync同步写入内容
语法:fs.writeFileSync(path,data[, options])
- path, 被写入文件的路径(相对路径或绝对路径)
- data:要写入的内容,字符串格式。
- options:写入文件的参数配置,默认值的utf8编码。
特点:writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖。
fs.writeFile异步写入内容
语法:fs.writeFile(path,content,utf8,回调函数)
特点:writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖。
fs模块中的常用方法
| API | 作用 | 备注 |
|---|---|---|
| fs.access(path, callback) | 判断路径是否存在 | |
| fs.appendFile(file, data, callback) | 向文件中追加内容 | |
| fs.copyFile(src, callback) | 复制文件 | |
| fs.mkdir(path, callback) | 创建目录 | |
| fs.readDir(path, callback) | 读取目录列表 | |
| fs.rename(oldPath, newPath, callback) | 重命名文件/目录 | |
| fs.rmdir(path, callback) | 删除目录 | 只能删除空目录 |
| fs.stat(path, callback) | 获取文件/目录信息 | |
| fs.unlink(path, callback) | 删除文件 | |
| fs.watch(filename[, options][, listener]) | 监视文件/目录 | |
| fs.watchFile(filename[, options], listener) | 监视文件 | |
| fs.existsSync(absolutePath) | 判断路径是否存在 |
服务器相关概念
服务器的类型
根据服务不同,服务器的类型也不同:
- web服务器
- ftp服务器
- 数据库服务器
web服务器
- 用户通过浏览器来享受web服务器提供的服务。
- 我们用url地址来访问某个web服务器上的资源。
- 浏览器端发起请求,web服务器收到请求后,响应这个请求,并将处理结果返回给浏览器。
- 浏览器端与web服务器是通过http协议来进行请求和响应的。
IP地址
- 全称:Internet Protocol Address
- 作用:标识一个网络设备(计算机、手机、电视)在某一个具体的网络当中的地址,要访问某个电脑上的资源,先要找到它的ip。在同一个网络中,计算机的IP是不允许相同的,都是唯一的。
- IPV4格式:[0-255].[0-255].[0-255].[0-255] 即为四个 0-255 的数字组成。
- 127.0.0.1 特指本机ip地址。(只能自己访问)
- 192.168.106.2 (这种地址叫做局域网地址)(可以在当前局域网中的所有电脑都可以访问)
域名
- ip地址的别名,由于ip地址不好记忆,我就给它们取个好记的别名。localhost这个域名特指127.0.0.1这个地址。
- 域名解析系统:把域名翻译成Ip地址的系统。
端口
- 一个IP地址的端口可以有65536个,范围是从[0,65535])。不同的端口被不同的软件占用,以提供不同的服务。
- 服务器要提供服务必须要通过指定的端口。
HTTP协议
- 制定客户端与服务器之间的通讯规则,不同的协议的作用也不同,主要了解HTTP协议。
- HTTP(HyperText Transfer Protocol) 超文本传输协议。
- 协议双方: 浏览器与web服务器都要遵守的协议。
- 请求通常是由浏览器发起的。
- HTTP协议中明确规定了请求数据和响应数据的格式(报文)
- 浏览器请求资源要遵守http协议:请求报文(请求行,请求头,请求体)
- 服务器返回资源要遵守http协议:响应报文(响应行,响应头,响应体)
用http模块写一个简单的web服务器
代码解析
- 引入核心模块,得到的http是一个对象。
- http.createServer方法创建一个http服务。参数是一个回调函数:当有http请求进来时,它会自动被调用。请求一次就调用一次。
- 第一个参数:客户端的请求。
- 第二个参数:设置对本次请求的响应。
- 设置响应体,结束请求:res.end()
- server.listen() 用来监听端口。
- 格式:server.listen(端口号, [回调函数])
- 回调是可选的。
修改代码后要重启
- 更改res.end() 的内容,重启后再次观察。
不同的URL返回不同的内容-req.url
-
req.url 用来获取本次请求的资源地址。req.url一定是以 / 开头的。
序号 浏览器中的url 服务器中的req.url 1 http://localhost:8080 / 2 http://localhost:8080/a.html /a.html 3 http://localhost:8080/js/jquery.js /js/jquery.js 4 http://localhost:8080/1.jpg /1.jpg 5 http://localhost:8080/api?a=1&b=2 /api?a=1&b=2
模块化
模块化的定义
- 一个js文件可以引入其他的js文件,能使用引入的js文件的中的变量、数据,这种特性就称为模块化。
- 使用模块化开发可以很好的解决变量、函数名冲突问题,也能灵活的解决文件依赖问题。
nodejs中的模块分类
- 核心模块
- 就是nodejs自带的模块,在安装完nodejs之后,就可以随意使用啦。相当于学习js时使用的Array对象。
- 例:fs, http, querystring, path
- 自定义模块
- 使用自定义模块实现在index.js中使用tool.js中的加法函数。
- 自定义模块名称不能与核心模块同名,例如: fs.js 是不行的。
- 使用固定关键字 require()导入模块,参数带有路径。
- 第三方模块
- 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块。
- 相当于别人写好的函数或者库。例如JQuery库,arttemplate。
导出模块的两种方式
exports 关键字写法 module.exports 关键字写法
-
两个对象的关系
-
初始exports和module.exports是指向同一块内存区域,其内容都是一个空对象。(exports是module.exports的别名)
-
在定义模块时:
- 如果直接给exports对象赋值(例如:exports={a:1,b:2}),此时,exports就不会再指向module.exports,而转而指向这个新对象,此时,exports与module.exports不是同一个对象。
-
在导出模块过程中,建议只用一种方式(建议直接使用module.exports)
了解npm
定义
npm全称Node Package Manager(node 包管理器),它的诞生是为了解决 Node 中第三方包共享的问题。npm不需要单独安装。在安装Node的时候,会连带一起安装npm。npm -v检查安装的情况。
包(package)与模块关系
- nodejs中一个模块就是一个单独的js文件
- 包是多个模块的集合。一个模块的功能比较单一,所以一个包一般会包含多个模块。
- npm 管理的单位是包。类似于网站和网页的区别:一个网站一般会包含多个网页。