Node.js

Node.js简介:

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境

Node.js 的官网地址: https://nodejs.org/zh-cn

Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API。

然而,基于 Node.js 提供的这些基础能,很多强大 的工具和框架如雨后春笋,层出不穷,所以学会了 Node.js ,可以让前端程序员胜任更多的工作和岗位:

① 基于 Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用

② 基于 Electron 框架(https://electronjs.org/),可以构建跨平台的桌面应用

③ 基于 restify 框架(http://restify.com/),可以快速构建 API 接口项目

④ 读写和操作数据库、创建实用的命令行工具辅助前端开发、etc…

Node.js 的学习路径:

JavaScript 基础语法 + Node.js 内置 API 模块(fs、path、http等)+ 第三方 API 模块(express、mysql 等)

查看已安装的Node.js版本号

打开终端,在终端输入命令 node –v 后,按下回车键,即可查看已安装的 Node.js 的版本号。 

终端中常用的快捷键

① 使用 键,可以快速定位到上一次执行的命令

② 使用 tab 键,能够快速补全路径

③ 使用 esc 键,能够快速清空当前已输入的命令

④ 输入 cls 命令,可以清空终端

fs系统模块

什么是fs系统模块

fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。

例如: ⚫ fs.readFile() 方法,用来读取指定文件中的内容

            ⚫ fs.writeFile() 方法,用来向指定的文件中写入内容

在JavaScript中导入 fs模块

//导入fs模块
const fs = require('fs')

读取指定文件中的内容

 fs.readFile() 的语法格式

// 导入fs 模块
const fs = require('fs')

// 调用fs.readFile()方法读取文件
// 参数1:读取文件的存放路径
// 参数2:读取文件的编码格式   默认UTF8
// 参数3:回调函数 拿到读取失败和成功的结果 err  dataStr

fs.readFile('./files/1.txt', 'utf-8', function(err, dataStr) {
    //   打印失败的结果
    // 如果读取成功err的值为null
    // 如果读取失败则err的值为作物对象  dataStr的值为 undefined
    console.log(err);
    console.log('-----------------------');
    // 打印成功的结果
    console.log(dataStr);
})

向指定的文件中写入内容

fs.writeFile() 的语法格式

// 导入fs模块
const fs = require('fs')

// 使用writeFile()方法向文件写入内容
// 参数1:文件的存放路径
// 参数2:文件的写入内容
// 参数3:回调函数
fs.writeFile('./files/1.txt', '我是帅哥', function(err, dataStr) {
    // 如果文件写入成功则 err的值为null
    // 如果文件写入失败 则err的值等于一个错误对象
    console.log(err);
    console.log(dataStr);
})

path 路径模块

path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理 需求。

例如: ⚫ path.join() 方法,用来将多个路径片段拼接成一个完整的路径字符串

            ⚫ path.basename() 方法,用来从路径字符串中,将文件名解析出来

路径动态拼接的问题

在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ 或 ../ 开头的相对路径时,很容易出现路径动态拼接错误的问题。 原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径。

可以使用path.join()__dirname 来解决

__dirname 用来表示当前目录

解决方案

路径拼接

path.join() 的代码示例

// 导入path路径模块
const path = require('path');
// 导入fs模块
const fs = require('fs')

// 注意  ../会抵消前面的路径
const pathStr = path.join('/a', '/b/c', '../', '/d', 'e')
console.log(pathStr); //   /a/b/d/e

const pathStr2 = path.join(__dirname, './files/1.txt')

fs.readFile(pathStr2, 'utf-8', function(err, dataStr) {
    if (err) {
        return console.log('读取失败!');
    } else {
        console.log('读取成功' + dataStr);
    }
})

path.basename()  和  path.extname()

path.basename()  获取路径中的文件名 不获取扩展名

参数1:必选参数 表示一个路径的字符串

参数2:可选参数 表示文件的扩展名

const path = require('path');

// 定义文件的存放路径
const fpath = '/a/b/c/index.html';
// 获取路径中的文件名  不获取扩展名
const nameWithoutExt = path.basename(fpath, '.html');
console.log(nameWithoutExt); //输出结果为 index

 path.extname() 获取路径中的扩展名 不获取文件名

 参数1:必选参数 表示一个路径的字符串

 返回得到扩展名的字符串

const path = require('path');

const fpath = '/a/b/c/index.html'
    // 获取路径中的扩展文件名称  不获取文件名
const nameWithoutStart = path.extname(fpath)
console.log(nameWithoutStart); // 输出结果为 .html

http 模块

什么是 http 模块

在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法,就 能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供 Web 资源服务。

导入http模块

//导入http模块
const http = require('http')

 http 模块的作用

服务器和普通电脑的区别在于,服务器上安装了 web 服务器软件,例如:IIS、Apache 等。通过安装这些服务器软件, 就能把一台普通的电脑变成一台 web 服务器。 在 Node.js 中,我们不需要使用 IIS、Apache 等这些第三方 web 服务器软件。因为我们可以基于 Node.js 提供的 http 模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供 web 服务

服务器相关概念

1. IP 地址

IP 地址就是互联网上每台计算机的唯一地址,因此 IP 地址具有唯一性。如果把“个人电脑”比作“一台电话”,那么“IP地 址”就相当于“电话号码”,只有在知道对方 IP 地址的前提下,才能与对应的电脑之间进行数据通信。

IP 地址的格式:通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数。

例如:用 点分十进表示的 IP地址(192.168.1.1) 注意: ① 互联网中每台 Web 服务器,都有自己的 IP 地址,例如:大家可以在 Windows 的终端中运行 ping www.baidu.com 命 令,即可查看到百度服务器的 IP 地址。

② 在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入 127.0.0.1 这个 IP 地址,就能把自己的电脑当做一台服务器进行访问了

2. 域名和域名服务器

尽管 IP 地址能够唯一地标记网络上的计算机,但IP地址是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套 字符型的地址方案,即所谓的域名(Domain Name)地址。 IP地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS,Domain name server)的电脑中。使用者 只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供 IP 地址和域名 之间的转换服务的服务器。

注意: ① 单纯使用 IP 地址,互联网中的电脑也能够正常工作。但是有了域名的加持,能让互联网的世界变得更加方便。

② 在开发测试期间, 127.0.0.1 对应的域名是 localhost,它们都代表我们自己的这台电脑,在使用效果上没有任何区别。

3. 端口号

计算机中的端口号,就好像是现实生活中的门牌号一样。通过门牌号,外卖小哥可以在整栋大楼众多的房间中,准确把外卖 送到你的手中。 同样的道理,在一台电脑中,可以运行成百上千个 web 服务。每个 web 服务都对应一个唯一的端口号。客户端发送过来的 网络请求,通过端口号,可以被准确地交给对应的 web 服务进行处理。

注意: ① 每个端口号不能同时被多个 web 服务占用。

           ② 在实际应用中,URL 中的 80 端口可以被省略

创建最基本的 web 服务器

创建 web 服务器的基本步骤

① 导入 http 模块

② 创建 web 服务器实例

③ 为服务器实例绑定 request 事件,监听客户端的请求

④ 启动服务器

// 1.导入http模块
const http = require('http');

//2.创建web服务器实例
const server = http.createServer();
//3.为服务器绑定 request事件  监听客户请求
server.on('request', function(req, res) {
    console.log('Hello web');
});
//4.启动服务器
server.listen(8080, function() {
    console.log('server running at http://127.0.01:8080');
})

req 请求对象

只要服务器接收到了客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理函数。 如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式

server.on('request', (req, res) => {
    // req.url是客户端请求的URL地址
    const url = req.url;
    // req.method 是客户端请求的 method 类型
    const method = req.method
    const str = `Your requuest url is ${url}.and request is ${method}`
    console.log(str);
    // 调用res.end()方法 向客户端响应一些内容
    res.end(str)
})

res 响应对象

在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式

server.on('request', (req, res) => {
    // res是响应对象 它包含了与服务器相关的数据和属性 例如
    // 要发送客户端的字符串
    const str = `Your requuest url is ${url}.and request is ${method}`
    // 调用res.end()方法 向客户端响应一些内容
    res.end(str)
})

解决中文乱码问题

当调用 res.end() 方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式

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(str)
})

什么是模块化

模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组 合、分解和更换的单元

编程领域中的模块化

编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。 把代码进行模块化拆分的好处:

① 提高了代码的复用性

② 提高了代码的可维护性

③ 可以实现按需加载

Node.js 中模块的分类

Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:

内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)

自定义模块(用户创建的每个 .js 文件,都是自定义模块)

第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

加载模块

使用强大的 require() 方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。例如:

//1.加载内置的 fs 模块
const fs = require('fs')

//2.加载用户的自定义模块
const custom = require('./文件路径')

//3.加载第三方模块

const moment = require('moment')

什么是模块作用域

函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问这种模块级别的访问限制,叫做模块作用域

const Custom = require('./08.模块作用域')
console.log(Custom);
const username = '张三'

function sayHello() {
    console.log('大家好,我是username');
}

向外共享模块作用域中的成员

1. module 对象 在每个 .js 自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息,打印如下

module.exports 对象

在自定义模块中,可以使用 module.exports 对象,将模块内的成员共享出去,供外界使用。 外界用 require() 方法导入自定义模块时,得到的就是 module.exports 所指向的对象

.共享成员时的注意点

使用 require() 方法导入模块时,导入的结果,永远以 module.exports 指向的对象为准

 exports 和 module.exports 的使用误区

时刻谨记,require() 模块时,得到的永远是 module.exports 指向的对象

注意:为了防止混乱,建议大家不要在同一个模块中同时使用 exports 和 module.exports

Node.js 中的模块化规范

Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖。 CommonJS 规定:

① 每个模块内部,module 变量代表当前模块。

② module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。

③ 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块

模块的加载机制

优先从缓存中加载 模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。 注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率

内置模块的加载机制

内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高。 例如,require('fs') 始终返回内置的 fs 模块,即使在 node_modules 目录下有名字相同的包也叫做 fs

自定义模块的加载机制

使用 require() 加载自定义模块时,必须指定以 ./ 或 ../ 开头的路径标识符。在加载自定义模块时,如果没有指定 ./ 或 ../ 这样的路径标识符,则 node 会把它当作内置模块或第三方模块进行加载。

同时,在使用 require() 导入自定义模块时,如果省略了文件的扩展名,则 Node.js 会按顺序分别尝试加载以下的文件:

① 按照确切的文件名进行加载

② 补全 .js 扩展名进行加载

③ 补全 .json 扩展名进行加载

④ 补全 .node 扩展名进行加载

⑤ 加载失败,终端报错

Express 简介

1. 什么是 Express 官方给出的概念:Express 是基于 Node.js 平台快速、开放、极简的 Web 开发框架。 通俗的理解:Express 的作用和 Node.js 内置的 http 模块类似,是专门用来创建 Web 服务器的。 Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方

法。 Express 的中文官网: http://www.expressjs.com.cn

Express 能做什么

对于前端程序员来说,最常见的两种服务器,分别是:

Web 网站服务器:专门对外提供 Web 网页资源的服务器。

API 接口服务器:专门对外提供 API 接口的服务器。 使用 Express,我们可以方便、快速的创建 Web 网站的服务器或 API 接口的服务器

安装Express

所处项目中,运行以下命令,即可将express安装到项目中使用

npm  i  express

创建基本的 Web 服务器

//引入express模块
const express = require('express');


创建服务器实例
const app = express()


//启动web服务器
app.listen(80, () => {
    console.log('http://127.0.0.1');
})

监听 GET 请求

通过 app.get() 方法,可以监听客户端的 GET 请求,具体的语法格式如下

​
​
//参数1:客户端请求的URL地址
//参数2:请求对应的处理函数

//req:请求对象
//res:响应对象

app.get('/user', (req, res) => {
   //回调函数
})

​

​

监听 POST 请求

通过 app.post() 方法,可以监听客户端的 POST 请求,具体的语法格式如下

​
​
//参数1:客户端请求的URL地址
//参数2:请求对应的处理函数

//req:请求对象
//res:响应对象

app.post('/user', (req, res) => {
   //回调函数
})

​

把内容响应给客户端

通过 res.send() 方法,可以把处理好的内容,发送给客户端

app.post('/user', (req, res) => {
    // 调用express 提供的 res.send()方法 向客户端响应一个 文本字符串
    res.send('请求成功')
})

app.get('/user', (req, res) => {
    // 调用express 提供的 res.send()方法 向客户端响应一个 文本字符串
    res.send('请求成功')
})

获取 URL 中携带的查询参数

通过 req.query 对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数

app.get('/', (req, res) => {
   //req.query 默认是一个空对象
   //客户端使用?name=zs&age=20 这种查询字符串形式 发送到服务器的参数
   //可以通过req.query 对象访问到 例如:
   //req.query.name  req.query.age
    console.log(req.query);
})

获取 URL 中的动态参数

通过 req.params 对象,可以访问到 URL 中,通过 : 匹配到的动态参数

app.get('/user/:id/:name', (req, res) => {
        //req.params是动态匹配到的 URL 参数
        console.log(req.params);
        res.send(req.params)
    })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值