nodejs简介
nodejs什么是?
为什么学nodejs?
- 了解前后端交互流程
- 能够自己写api接口
- 防止甩锅,明确前后端职责范围
- 为了更高的薪资
nodejs的特点
- 单线程
- 非阻塞I/O(input/output)
- 网络请求、数据库处理、文件的读写。。。
- 事件驱动
环境配置
nodejs安装
-
Node.js是一个让JavaScript运行在服务器端的开发平台,所以必须首先在本机安装Node.js环境
-
官网术语解释
- LTS 版本:Long-term Support 版本,长期支持版,即稳定版。
- Current 版本:Latest Features 版本,最新版本,新特性会在该版本中最先加入。
-
在cmd中,输入 node -v 就能够查看版本号
-
同时,nodejs 也内置了npm,通过 npm -v 查看版本号
-
NPM是包管理工具,包的结构使您能够轻松跟踪依赖项和版本
-
生成 package.json 配置文件
- npm init 自定义配置
- npm init -y 跳过所有提问,生成默认配置文件
npm install 包名 -g 全局安装包
npm install 包名 / npm install 包名 -S 安装项目依赖
npm install 包名 --save-dev / npm install 包名 -D 安装开放依赖
nvm
- 通过 nvm 安装管理多个nodejs版本
- nvm常用命令
- nvm install version 安装version版本的nodejs,例如:nvm install 12.16.0
- nvm uninstall version 卸载version版本的nodejs,例如:nvm uninstall 12.16.0
- nvm list 显示所有安装的nodejs版本
- nvm list available 显示可以安装的nodejs的版本
- nvm use version 使用指定的nodejs版本,例如:nvm use 12.16.0
NPM淘宝镜像
- 查看npm源地址
npm config get registry 默认源:https://registry.npmjs.org/ - 通过cnpm使用
npm install -g cnpm --registry=https://registry.npm.taobao.org - 通过npm使用
npm config set registry https://registry.npm.taobao.org 推荐
运行程序
js运行环境
- 浏览器(基本语法、dom、bom、ajax请求...)
- 服务器(基本语法、操作本地文件、操作数据库...)
- 限制语言能力的不是语言本身,而是语言的运行环境
运行nodejs程序
- 在命令行中执行node指令并回车,进行node的交互式环境(REPL环境)
- 把javascript代码写在后缀为.js的文件中,命令行执行:node xx.js
- 按下 ctrl + c 退出当前执行程序
- node.js是服务端的程序,写的js语句,都将运行在服务器上
- node.js没有根目录、没有web容器的概念!
nodemon
- nodemon会实时监听js代码,发现有修改后自动重启服务器
- 安装:npm install --global nodemon
- 之前使用:node xxx.js 改成:nodemon xxx.js
模块化
- 内置模块
- 第三方模块
- 自定义模块
commonjs规范
- node应用由各种包各种模块组成,采用的commonjs模块规范
- commonjs加载模块是同步的,模块加载的顺序,按照其在代码中出现的顺序
- require 方法用于加载模块文件,相当于读入并执行一个js文件
- module.exports 属性表示当前模块对外输出的接口,让其他文件加载该模块
http模块
- http 模块 可以用于创建http服务器与http客户端
创建http服务器
- 服务器:一台电脑,安装服务器软件,通过ip地址和端口号访问
- var http = require('http'); 加载http模块
- var server = http.createServer(); 创建http服务
- server.on('request', callback); request事件用于监听来自客户端的请求
- server.listen(port, host, callback); 启动http服务,监听3000端口
- 注意:
- 在监听request事件中,最后一定要res.end()结束响应。
- 浏览器显示中文可能是乱码,需设置响应头告诉浏览器显示时所使用的编码,要在res.end()之前设置响应头、状态码、响应内容类型及编码
res.setHeader("Content-Type","text/plain;charset=utf-8");
res.setHeader("Content-Type","text/html;charset=utf-8");
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
Content-Type:用于定义用户的浏览器如何处理将要加载的数据
text/html 表示响应内容为html的形式,浏览器对响应内容按html解析
text/css 表示响应内容为css的形式,浏览器对响应内容按css解析
text/plain 表示响应内容为纯文本的形式,浏览器不会对其进行其它处理
application/json 表示响应内容为序列化后的 JSON 字符串
......
创建http客户端
- http.get()
- http.request()
类似 $.get()
fs 模块
- fs模块提供了用于与文件系统进行交互的API
- CURD(Create Update Read Del)
fs.readFile(file[, options], callback) 读文件
参数1:要读取的文件路径,必填。
参数2:读取文件时的选项,比如:文件编码utf8。选填。
参数3:文件读取完毕后的回调函数,必填。
fs.writeFile(file, data[, options], callback) 写文件
参数1:要写入的文件路径,必填。
参数2:要写入的数据,必填。
参数3:写入文件时的选项,比如:文件编码。选填。
参数4:文件写入完毕后的回调函数,必填。
writeFile写入文件是先把文件内容清空再写入
如果要追加写入的话可以使用appendFile函数
- fs.unlink() 删除文件
- fs.mkdir() 创建文件夹
- fs.readdir() 读取文件夹
- fs.rmdir() 删除文件夹(只能删除空文件夹)
- fs.rename() 文件重命名
- fs.stat() 获得文件信息
stats.isFile() 是否为文件
stats.isDirectory() 是否为文件夹
// 同步读取文件,在关键位置捕获错误
try{
var data = fs.readdirSync('./')
} catch (err){
console.log(err)
}
console.log(data)
// 异步读取文件
fs.readdir('./',(err,data)=>{
console.log(data)
})
url 模块
- url 模块 用于处理与解析 URL
- url叫统一资源定位符
url.parse()方法 将url字符串转成对象
url.format()方法 将url对象转成字符串
let urlStr = 'https://www.baidu.com/ss/abc?wd=directory&spt=123&issp=888#head';
let urlObj = url.parse( urlStr ); // 默认false,query为字符串
let urlObj = url.parse(urlStr,true); // 设置true,query为对象
path 模块
- path模块提供用于处理文件路径和目录路径的实用工具
- path模块的默认操作会根据Node.js程序运行的操作系统而有所不同
path.join(path1[, path2]...) 将多个路径规范化拼接,返回拼接后的路径
path.resolve([...paths]) 将一系列路径解析成绝对路径,从右到左解析
- 如果没有参数调用,返回当前工作路径
path.basename(path[, ext]) 返回路径的最后部分(文件名)
- path目标路径,ext要截掉的内容
path.dirname(path) 与basename相对,返回除最后一部分的前面部分路径
querystring 模块
- querystring模块提供用于解析和格式化URL查询字符串的实用工具
将query字符串转成对象
let str = 'wd=directory&spt=123&issp=888';
let obj = qs.parse( str ); // 默认等价于 qs.parse( str, '&', '=' );
console.log( obj ); // { wd: 'directory', spt: '123', issp: '888' }
将对象转成query字符串
let obj = { wd: 'directory', spt: '123', issp: '888' };
let str = qs.stringify( obj );
console.log( str ); // 'wd=directory&spt=123&issp=888'
query字符串编码
let str = 'msg=你好&pw=123 456';
let res = qs.escape( str );
console.log( res ); // msg%3D%E4%BD%A0%E5%A5...
query字符串解码
res = qs.unescape( res );
console.log( res ); // 'msg=你好&pw=123 456'
全局变量
__dirname 表示当前执行的脚本所在目录的绝对路径
如:D:\phpstudy_pro\WWW\test\GP03\day33
__filename 表示当前执行的脚本文件的绝对路径
如:D:\phpstudy_pro\WWW\test\GP03\day33\test.js
process是一个全局进程模块
console.log( process.env ) 当前的环境信息
console.log( process.argv[2] ) 获取输入的命令
Error对象
let err = new Error('发送错误了');
console.log(err); 这只是一个错误对象,不会终止代码执行
throw err; 抛出错误,会终止代码执行
console.log('这里不会执行')
练习:
- 理解消化今天所学内容
- 相关练习代码自己敲一遍
- 自己封装querystring.parse 和 querystring.stringify 两个函数
Q.E.D.