目录
1.【http模块】
1.1 什么是 http 模块
http 模块是Node.js官方提供,用来创建web服务器的模块,通过http.createServer()方法
如果要希望使用http模块创建Web 服务器,则需要先导入它:
const http = require( 'http')
1.2 IP地址
IP地址就是互联网上每台计算机的唯一地址
IP地址的格式 :通常用“点分十进制”表示成(a.b.c.d)的形式,都是0~-255之间的十进制整数。
例如:用点分十进表示的市地址(192.168.1.1)
注意:
1. 互联网中每台Web服务器,都有自己的IP地址,例如:大家可以在Windows的终端中运行 ping www.baidu.com命令,即可查看到百度服务器的IP地址。
2.在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP地址。就能把自己的电脑当做一台服务器进行访问了。
1.3 域名和域名服务器
域名(Domain Name)地址 :一套字符型的地址方案。
域名服务器(DNS,Domain name server) :IP地址和域名是一一对应的关系。
域名服务器就是提供IР地址和域名之间的转换服务的服务器。
注意 :
1.单纯使用IP地址,互联网中的电脑也能够正常工作。但是有了域名的加持,能让互联网的世界变得更加方便.
2.在开发测试期间,127.0.0.1对应的域名是localhost,它们都代表我们自己的这台电脑,在使用效果上没有任何区别。
1.4 端口号
每个web服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的web服务进行处理。
注意 :
1.每个端口号不能同时被多个web 服务占用。
2.在实际应用中,URL中的80端口可以被省略。
2.【创建最基本的web服务器】
2.1 创建web服务器的基本步骤
1.导入 http模块
2.创建web 服务器实例
3.为服务器o例邦定 request 事件,监听客户端的请求4.启动服务器
示例代码:
// 1.导入 http模块
const http = require('http');
// 2.创建 web 服务器实例
const server = http.createServer();
// 3.为服务器实例绑定 require 事件,监听客户端的请求
server.on('require', function(req, res) {
console.log('Someone visit our web server.');
})
// 4.启动服务器
server.listen(8080, function() {
console.log('server running at http://127.0.0.1:8080');
})
ctrl+c停止服务器 80端口号可以省略
2.2 req 请求对象
调用通过server.on()为服务器绑定的request事件处理函数。
如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式:
const http = require('http')
const server = http.createServer()
// req 是请求对象,包含了与客户端相关的数据与属性
server.on('request', (req, res) => {
//req.url 是客户端请求的 URL 地址
const url = req.url
//req.method 是客户端请求的 method 类型
const method = req.method
const str = `Your request url is ${url},and request method is ${method}`
console.log(str)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
2.3 res 响应对象
在服务器的 request事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:
res.end()
1.res是响应对象,它包含了与服务器相关的数据和属性,例如 :要发送到客户端的字符串
2.res.end()方法的作用 :向客户端发送指定的内容,并结束这次请求的处理过程
2.4 解决中文乱码的问题
当调用res.end()方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式 :
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
//定义一个字符串,包含中文的内容
const str = `您请求的 URL 地址是 ${req.url},请求的 method 类型为${req.method}`
//调用res.setHeader()方法,设置Content-Type响应头,解决中文乱码的问题
res.setHeader('Content-Type', 'text/html; charset=utf-8')
//调用 res.end()方法 ,将内容响应给客户端
res.end(str)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
3.【根据不同的 url 响应不同的 html 内容】
3.1 核心实现步骤
1.获取请求的 url 地址
2.设置默认的响应内容为404 Not found
3.判断用户请求的是否为 / 或 /index.html 首页
4.判断用户请求的是否为 /about.htm l关于页面
5.设置 Content-Type 响应头,防止中文乱码
6.使用 res.end() 把内容响应给客户端
3.2 动态响应内容
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
// 1.获取请求的url 地址
const url = req.url
// 2设置默认的响应内容为404 Not found
let content = '<h1>404 Not found</h1>'
// 3,判断用户请求的是否为/或 /index.html 首页
// 4、判断用户请求的是否为 / about.html 关于页面
if (url === '/' || url === '/index.html') {
content = '<h1>首页</h1>'
} else if (url === '/about.html') {
content = '<h1>关于页面</h1>'
}
// 5.设置 Content-Type响应头,防止中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 6.使用res.end()把内容响应给客户端
res.end(content)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
4.【模块化】
4.1 什么是模块化
概念:模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
4.2 编程领域中的模块化
概念:就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。
把代码进行模块化拆分的好处 :
1.提高了代码的复用性
2.提高了代码的可维护性3.可以实现按需加载
4.3 模块化规范
概念:对代码进行模块化的拆分与组合时,需要遵守的那些规则。
例如:
1.使用什么样的语法格式来引用模块
2.在模块中使用什么样的语法格式向外暴露成员
好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己。
5.【Node.js中的模块化】
5.1 node.js中模块的分类
内置模块
由Node.js 官方提供的,例如fs、path、http等
自定义模块
用户创建的每个.js 文件,都是自定义模块
第三方模块
由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载
5.2 加载模块
加载内置的fs模块
const fs = require('fs')
加载用户的自定义模块
const custom = require('./custom.js')
加载第三方模块
const moment = require('moment')
注意:
使用require()方法加载其它模块时,会执行被加载模块中的代码。
5.3 Node.js 中的模块作用域
模块作用域
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
好处
防止了全局变量污染的问题
5.4 向外共享模块作用域中的成员
module 对象
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息
module.exports对象
1.在自定义模块中,可以使用module.exports 对象,将模块内的成员共享出去,供外界使用。
2.外界用 require() 方法导入自定义模块时,得到的就是module.exports所指向的对象。
共享成员时的注意点
使用require(方法导入模块时,导入的结果,永远以module.exports指向的对象为准。
exports 对象
由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了exports 对象。默认情况下,exports 和module.exports 指向同一个对象。最终共享的结果,还是以module.exports 指向的对象为准。
exports和module.exports的使用误区
时刻谨记,require()模块时,得到的永远是 module.exports 指向的对象 :
注意 :
为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports
5.5 Node.js 中的 模块化规范
Node.js 遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖。
CommonJS规定 :
1.每个模块内部,module 变量代表当前模块。
2.module变量是一个对象,它的exports属性(即module.exports)是对外的接口。
3.加载某个模块,其实是加载该模块的 module.exports 属性。require()方法用于加载模块。
6.npm与包
6.1 包
什么是包
Node.js 中的第三方模块又叫做包,指的是同一个概念,只是叫法不同。
包的来源
不同于Node.,js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用。
注意:
Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用。
为什么需要包
1.由于Node.js 的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。
2.包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。
3.包和内置模块之间的关系,类似于jQuery和浏览器内置API之间的关系。
从哪里下载包
国外有一家IT公司,叫做 npm, lnc.这家公司旗下有一个非常著名的网站:https:/www.npmjs.com/,它是全球最大的包共享平台。
如何下载包
npm, Inc.公司提供了一个包管理工具,我们可以使用这个包管理工具,从https://registry.npmjs.org/服务器把需要的包下载到本地使用。
这个包管理工具的名字叫做Node Package Manager (简称npm包管理工具),这个包管理工具随着Node.js 的安装包一起被安装到了用户的电脑上。
大家可以在终端中执行npm -v命令,来查看自己电脑上所安装的npm包管理工具的版本号。
6.2 npm 初体验
格式化时间的传统做法
1.创建格式化时间的自定义模块
2.定义格式化时间的方法
3.创建补零函数
4.从自定义模块中导出格式化时间的函数
5.导入格式化时问的自定义模块
6.调用格式化时间的函数
示例代码:
//1.定义格式化时间的方法
function dateFormat(dtstr) {
const dt = new Date(dtstr)
const y = dt.getFullYear()
const m = padZero(dt.getMonth() + 1)
const d = padZero(dt.getDate())
const hh = padZero(dt.getHours())
const mm = padZero(dt.getMinutes())
const ss = padZero(dt.getSeconds())
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}
//定义补零的函数
function padZero(n) {
return n > 9 ? n : '0' + n
}
module.exports = {
dateFormat
}
格式化时间的高级做法
1.使用npm包管理工具,在项目中安装格式化时间的包 moment
2.使用require()导入格式化时间的包
3.参考moment 的官方API文档对时间进行格式化
在项目中安装包的命令
如果想在项目中安装指定名称的包,需要运行如下的命令:
npm install 包的完整名称
简写(更推荐):
npm i 包的完整名称
使用 moment 对时间格式化
1.安装moment包
npm i monent
2.导入需要的包
注意:导入的名称,就是装包时的名称
const moment = require('moment')
const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt)
初次装包后多了哪些文件
初次装包完成后,在项目文件夹下多一个叫做 node_modules的文件夹和package-lock.json的配置文件。
node modules,文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。
package-lock json配置文件用来记录node_modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。
注意 :
程序员不要手动修改node_modules 或 package-lockjson文件中的任何代码,npm包管理工具会自动维护它们。
安装指定版本的包
默认情况下,使用npm install 命令安装包的时候,会自动安装最新版本的包。如果需要安装指定版本的包,可以在包名之后,通过@符号指定具体的版本,
例如:
npm i moment@2.22.2
包的语义化版本规范
包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如2.24.0
其中每一位数字所代表的的含义如下:
第1位数字 :大版本
第2位数字 :功能版本第3位数字 :Bug修复版本
版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。