一、JavaScript 与 Node.js
1.Javascript
一门编程语言,用于web前端开发,运行在浏览器环境,由浏览器解析执行。
主要语法包括:变量、数据类型;循环、分支、判断;函数、作用域、this。
执行过程:待执行的js代码 => javascript 解析引擎
2.Node.js
基于 Chrome V8 引擎的 Javascript 运行环境。可以快速构建网络服务及应用,是用Javascript语言构建的服务平台,可用于后端建立服务器。
Node.js 环境安装
官网安装包下载:nodejs.org/zh-cn
LTS 长期稳定版本
Current 新特性尝鲜版
打开终端,查看已安装 Node 版本号:node -v
二、Node.js 内置模块
1.fs 文件系统
Node 官方提供的 用来操作文件的模块,它提供了一些了一系列方法,满足用户对文件的操作需求
1.1 fs.readFile() 读取指定文件的内容
使用之前需要先导入:const fs = require('fs')
fs.readFile(path [, option], callBack)
参数1:必选参数, 字符串, 表示文件路径
参数2:可选参数,表示以什么编码格式读取文件
参数3:必选参数,通过回调函数获得读取结果
fs.readFile('./test.text', 'utf8', function(err,dataStr){
// 读取成功 err 为 null
// 读取失败 err 为错误对象 dataStr 为 undefined
console.log(err)
if(err) console.log(err.message) return
console.log(dataStr)
})
1.2 fs.writeFile() 向指定文件中写入内容
fs.writeFile(file, data [, option], callBack)
参数1:必选参数,表示文件路径
参数2:必选参数,写入文件的内容
参数3:可选参数,表示以什么编码格式写入文件
参数4:必选参数,通过回调函数获得写入结果
fs.writeFile('./test1.text', 'aabbccdd', function(err,dataStr){
if(err) {
console.log("文件写入失败:",err.message)
return
}
console.log("文件写入成功!")
})
注意:fs.writeFile 只可以创建文件,不可以创建文件夹(路径),重复调用 fs.writeFile 写入同一个文件,新写入的内容会覆盖原内容。
fs 路径拼接问题
使用 fs 模块操作文件时,如果提供的路径是 ./ 或 ../ 开头的相对路径时,容易出现路径动态拼接错误的问题。 原因:代码在运行时,会以执行 node 命令时所在目录,动态拼接出操作该文件的完整路径。如下图所示:
01.js 所在的文件目录为:E:\selfProject\nodeStudy\code, 在此目录下直接运行 01.js 的时候(node 01.js)
代码中的 ./chengji.text 会被编译成 E:\selfProject\nodeStudy\code\chengji.text, 在该路径下,可以找到 chengji.text,运行成功。但是,当我们改变 01.js 的运行目录,变为上级目录时,运行就会有问题,如下图所示:
在上面的示例中,代码中 ./chengji.text 会被编译成 E:\selfProject\nodeStudy\chengji.text, 在该路径下,并没有 chengji.text,所以运行报错。
出现路径拼接的问题,是由于使用了 ./ 或 ../ 开头的相对路径时,解决这个问题,可以通过使用完整的路径的方法解决。如直接使用fs.readFile('E:\\selfProject\\nodeStudy\\code\\chengji.text', 'utf8', function(err,dataStr){})。
需要注意的是,使用完整的路径要对路径中的 \ 进行转义。
上面的方法虽然避免了路径报错的问题,但是也带来了另一个问题,当文件资源位置发生变化的时候,整个路径修改比较麻烦。
最好的解决方案是通过 __dirname 获取当前路径进行处理, console.log(__dirname)。上面代码可以修改为:
fs.readFile(__dirname + '/chengji.text', 'utf8', function(err,dataStr){})
2.path 路径模块
Node.js 官方提供的,用来处理路径的模块,它提供了一些方法和属性,满足用户对路径处理的需求。
2.1 path.join() 多个路径拼接成一个完整的路径。
使用之前需要先导入:const path = require('path')
path.join([...paths])
不限制参数个数,参数为路径的字符串。
const pathStr = path.join("/a", "/b/c", "../", "/d")
console.log(pathStr, "pathStr") // \a\b\d ../ 会抵消上一层路径
2.2 path.basename() 获取路径中的最后一部分,一般用来获取路径中的文件名。
path.basename(path[, ext])
path,第一个参数,必选参数,表示一个路径的字符串。
ext,第二个参数,可选参数,表示文件扩展名。
返回路径的最后一个部分。
const fullPath = "a/b/c/index.html"
const fullName = path.basename(fullPath) // index.html
const name = path.basename(fullPath, ".html") // index
2.3 path.extname() 获取路径中的扩展名部分。
const extName = path.extname('a/b/c/index.html') // .html
3.http 模块
Node.js 官方提供的、用来创建 web 服务器的模块,通过 http 提供的 http.createServer() 方法就能将一台普通的电脑变成一台 web 服务器。
3.1 客户端与服务器
在网络节点中,负责消费资源的站点叫做客户端,负责对外提供网络资源的站点叫做服务器。
普通电脑与服务器的区别在于,服务器电脑上安装了 web 服务器软件,例如 IIS、Apache 等。
在 Node.js 中,我们不需要安装 IIS、Apache 等第三方服务器软件,我们可以基于 Node 提供的 http 模块,通过简单的代码,,实现一个服务器软件,从而提供 web 服务。
3.2服务器相关概念
1.IP 地址
互联网中每台计算机的唯一标识,具有唯一性,一般使用点分十进制表示成(a.b.c.d)的形式,其中a、b、c、d都是都是0~255之间的整数。
注意: 互联网中的每台 web 服务器都有自己的 IP 地址,如:我们可以通过ping www.baidu.com 查看百度的 IP 地址(182.61.200.7, 我们可以在浏览器中直接输入这个 IP 地址访问百度的页面)。
在开发期间,我们自己的电脑既是一台服务器,也是一台客户端,为了方便测试,我们可以在浏览器中输入 127.0.0.1 ,将自己电脑当做服务器进行访问。
2.域名与域名服务器
IP 是一台电脑在互联网中的唯一标识,使用数字来进行区分,不直观,不方便记忆,于是人们发明了另一套 字符型的 地址方案,即域名地址。
域名类似于 IP 的别名,辅助我们记忆服务器的地址,IP 与域名是一一对应的关系,这份对应关系存在一个叫域名服务器的电脑中(DNS, Domain Name Server),使用者只需要使用对应的域名即可对相对应的服务器进行访问,转换工作由域名服务器实现。域名服务器就是提供 IP 和域名进行相互转化服务的服务器。
注意: 单纯使用 IP 地址,电脑也可以正常工作,有了域名的加持,能使互联网世界更加方便。
在开发测试期间, 127.0.0.1这个 IP 对用的域名是 localhost,他们都代表我们自己的电脑,在效果上没有任何区别。
3.端口号
计算机中的端口号就像我们生活中的门牌号一样,一台计算机可以运行成千上万的 web 服务,每一个 web 服务都对应唯一的端口号,客户端发送来的网络请求,可以通过端口号准确的交给 web 服务处理。
注意: 每个端口号不能同时被多个 web 服务所占用。 在实际应用中,url 中的80 端口可以被省略。
3.2 创建基本的 web 服务器
- 导入 http 模块
- 创建 web服务器实例
- 为服务器实例绑定 request 事件
- 启动服务器
// 导入模块
const http = require("http")
// 创建实例
const server = http.createServer();
// 绑定事件 on 方法,为服务器绑定事件
server.on("request",(req,res)=>{
console.log("some on visit our server")
})
// 启动监听 listen(端口号, cb回调)
server.listen(80,()=>{
console.log("http server is runing at 127.0.0.1")
})
req 请求对象: 只要服务器接收到了客户端的请求,就会调用 on 方法为服务器绑定的 request 事件函数。req 请求对象中保存了客户端请求相关的数据和属性。
server.on("request",(req,res)=>{
// req.url 客户端请求的url
// req.method 客户端请求的 method 类型
let str = `your request url is ${req.url}, request method is ${req.method}`
console.log(str)
})
res 响应对象: 包含了服务器相关的数据和属性。
server.on("request",(req,res)=>{
// req.url 客户端请求的url
// req.method 客户端请求的 method 类型
let str = `your request url is ${req.url}, request method is ${req.method}`
console.log(str)
// res.end() 向客户端发送指定的内容, 并结束此次请求过程
res.end(str)
})
解决中文乱码问题: 设置响应头 Content-type 值为:text/html;charset=utf-8
server.on("request",(req,res)=>{
// req.url 客户端请求的url
// req.method 客户端请求的 method 类型
let str = `此次请求 url 为 ${req.url}, 请求方法为 ${req.method}`
res.setHeader("Content-type", "text/html;charset=utf-8")
// res.end() 向客户端发送指定的内容, 并结束此次请求过程
res.end(str)
})
根据不同的 url 得到不同的内容:
// 创建服务器
const http = require("http")
// 读文件
const fs = require("fs")
// 处理路径
const path = require("path")
const server = http.createServer()
server.on("request",(req,res)=>{
const url = req.url;
let content = "404 Not Found"
if(url == "/" || url == "index"){
content = "<h1>首页</h1>"
}
if(url == "/about"){
content = "<h1>关于我们</h1>"
}
// console.log(content,"content")
res.setHeader("Content-type", "text/html;charset=utf-8")
res.end(content)
})
server.listen(80,()=>{
console.log("http server is runing at 127.0.0.1")
})
如有问题,欢迎探讨,如果满意,请手动点赞,谢谢!🙏
及时获取更多姿势,请您关注!!