Node.js初学笔记

123 阅读6分钟

借助于Node.js,可以用javaScript进行后端开发。作为一个异步事件驱动的 JavaScript 运行时,Node.js 被设计用来构建可扩展的网络应用。

Node.js简介

Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
Node.js官网:nodejs.org/zh-cn/

Node.js的JavaScript运行环境

image.png

注意:

  1. 浏览器是JavaScript的前端运行环境
  2. Node.js是JavaScript的后端运行环境
  3. Node.js中无法调用Dom和Bom等浏览器内置API

Node.js可以做什么

Node.js本身仅提供了基础的功能和API。但,基于Node.js产生了许多工具和框架:

  1. Express( www.expressjs.com.cn/ ),快速构建Web应用
  2. Electron( www.electronjs.org/ ),构建跨平台的桌面应用
  3. restify( restify.com/ ),快速构建API接口项目
  4. 读写和操作数据库、创建实用的命令行工具辅助前端开发
  5. 等等

Node.js安装

安装

可以直接在官网中下载安装。

  • 其中,LTS为长期稳定版,Current为新特性尝鲜版。
  • 安装过程中,安装位置不建议更改。

查看版本号

打开终端,输入node -V,回车。
Windows快速打开终端的方法:

  • Windows徽标键+R打开面板,输入cmd打开终端。

在Node.js环境中执行js代码

  1. 打开终端
  2. 输入 node 要执行的文件路径
  • 修改当前终端路径到文件所在文件夹路径,在地址栏复制文件夹路径,在终端输入cd 复制的文件夹路径
  • 直接打开文件所在目录,在空白处按住Shift键右键,单击在此处打开PowerShell窗口,可直接打开终端并切换到当前目录。
    cmd终端出现更早,功能更基础;PowerShell终端在cmd基础上做了升级,功能更强大。

终端中的快捷键

  • 键,快速定位到上一次执行的命令
  • tab键,快速补全路径
  • esc键,快速清空当前已输入的命令
  • cls命令,清空终端

内置模块

fs文件系统模块

什么是fs文件系统模块

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

  • fs.readFile()方法,用来读取指定文件中的内容
  • fs.writeFile()方法,用来向指定的文件中写入内容
    在js中导入fs模块:
const fs = require('fs')

读取指定文件中的内容

fs.readFile()的语法格式

//参数1,必选参数,字符串,表示文件路径
//参数2,可选参数,表示以什么编码格式读取文件,一般用utf8
//参数3,必选参数,文件读取完成后,通过回调函数拿到读取的结果
fs.readFile(path,options,callback)

fs.readFile()的示例代码

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

向指定文件中写入内容

fs.writeFile()的语法格式

//参数1,必选参数,字符串,表示文件的存放路径
//参数2,必选参数,表示要写入的内容
//参数3,可选参数,表示以什么编码格式写入文件,默认utf8
//参数4,必选参数,文件写入完成后的回调函数
fs.writeFile(file,data,options,callback)

fs.writeFile()的示例代码

fs.writeFile('./files/2.txt', '写入的内容', (err) => {
    //如果文件写入成功,则err值为null
    //如果文件写入失败,则err值为错误对象
    console.log(err)
}

注意

  • fs.writeFile()方法只能用来创建文件,不能用来创建路径
  • 重复调用fs.writeFile()方法写入文件,新写入的内容会覆盖之前写入的内容

路径动态拼接的问题

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

  1. 使用绝对路径存放文件。(移植性非常差,不利于维护)
  2. __dirname+路径拼接,__dirname表示当前文件所处的目录

path路径模块

什么是path路径模块

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

  • path.join(),将多个路径片段拼接成一个完整的路径字符串。
  • path.basename(),从路径字符串中,将文件名解析出来。
    在js中导入path模块:
const path = require('path')

路径拼接

path.join()的语法格式

//...paths <string> 路径片段的序列
//返回值:<string>
path.join([...paths])

path.join()的示例代码

//注意,../会抵消前面一层路径
const pathStr = path.join('/a', '/b/c', '../', './d', '/e')
console.log(pathStr) //输出abde

const pathStr2 = path.join(__dirname, './files/1.txt')
console.log(pathStr2) //输出 当前文件所处目录/files/1.txt

建议路径拼接使用path.join(),而不是+

获取路径中的文件名

path.basename()的语法格式

//path <string> 必选参数,表示一个路径的字符串
//ext <string> 可选参数,表示文件扩展名
//返回: <string> 表示路径中的最后一部分
path.basename(path,ext)

path.basename()的代码示例

const fpath = '/a/b/c/index.html'
const fullname = path.basename(fpath)
console.log(fullname) //输出index.html

const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) //输出index

获取路径中的文件扩展名

path.extname()的语法格式

//path <string> 必选参数,表示一个路径的字符串
path.extname(path)

path.extname()的代码示例

const fpath = '/a/b/c/index.html'

const fext = path.extname(fpath)
console.log(fext) //输出.html

http模块

什么是http模块

http模块是Node.js官方提供的、用来创建Web服务器的模块。通过http模块提供的http.createServer()方法,就能把一台普通的电脑变成Web服务器,对外提供Web资源服务。
在js中导入http模块:

const http = require('http')

创建最基本的web服务器

创建web服务器的步骤

  1. 导入http模块
  2. 创建web服务器实例
  3. 为服务器实例绑定request事件,监听客户端的请求
  4. 启动服务器

创建web服务器的代码示例

//1. 导入http模块
const http = require('http')
//2. 创建web服务器实例
const server = http.createServer()
//3. 为服务器实例绑定request事件,监听客户端的请求
server.on('request', (req, res) => {
    console.log('soneone visit our web server.')
})
//4. 启动服务器
server.listen(8081, () => {
    console.log('server running at http://127.0.0.1:8081')
})

req请求对象

req是请求对象,包含了与客户端相关的数据和属性

  • req.url:客户端请求的URL地址
  • req.method:客户端请求的method类型

res响应对象

res是响应对象,包含了与服务端相关的数据和属性

  • res.end(): 向客户端发送指定内容,并结束这次请求的处理过程

解决中文乱码问题

res.setHeader('Content-Type','text/html; charset=utf-8')