Node.js
Node.js是一个开源的,跨平台的JavaScript运行环境
通俗来说:Node.js是一款应用程序,它可以运行JavaScript
Buffer
创建
//1.创建了一个长度为10字节的空buffer
let buf = Buffer.alloc(10);
//2.创建了一个长度为10字节的buffer,可能会用到以前的数据。速度比前者快
let buf = Buffer.allocUnSafe(10);
//3.from
let buf = Buffer.from('hello');
let buf = Buffer.from([105,111,151]);
操作
let buf = Buffer.from([105,111,15]);
console.log(buf.toString());//将buffer转为string,默认使用utf-8
//读取
console.log(buf[0]);
//修改
buf[1] = 12;
注意:
- 如果修改的数值超过了255,则超过的部分会被丢弃
- 一个utf-8一般占3个字节
fs
文件写入
//var,let,const都可以
//变量名随意
//后面都是强制要求
const fs = require('fs');
//1. 异步写入
fs.writeFile(file, data, [options], callback);
fs.writeFile('./test.txt','aaaa', err => {
if(err){
console.log("error");
return;
}
console.log("success");
})
//2.同步写入
fs.writerFileSync(file, data, [options], callback);
//3.追加写入,二者返回值都是undefined
fs.appendFile[Sync](file, data, [options], callback);
//4.流式写入
fs.createWriteStream(path, [options]);
let ws = fs.createWriteStream("文件路径");
ws.write("内容");
ws.end();//结束
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数
流式写入适用于大文件写入或频繁写入的场景,
writeFile
适用于写入频率较低的场景
文件读取
//1.异步/同步读取,返回值为undefined
fs.readFile[Sync](path, [options], callback);
//2.流式读取
let rs = fs.createReadStream(path, [options]);
//绑定data事件
rs.on('data', chunk => {
console.log(chunk.length);
});
//end,可选事件
rs.on('end', () => {
console.log('end');
});
文件移动与重命名
fs.rename[Sync](oldpath, newpath, callback);
文件删除
fs.unlink[Sync](path, callbask);
文件夹操作
mkdir[Sync]创建
fs.mkdir[Sync](path, [options], callback);
//递归创建
fs.mkdir('.a/b/c', {recursive: true}, err =>{
});
readdir[Sync]读取
fs.readdir[Sync](path, [options], callback);
fs.readdir('path', (err, data) => {
console.log(data);
})
rmdir[Sync]删除
fs.rmdir[Sync](path, [options], callback);
//递归删除类似,建议使用的是fs.rm()
查看资源状态
fs.stat[Sync](path, [options], callback);
fs.stat('path', (err, data) =>{
})
__dirname
__dirname
与require
类似,都是Node.js环境中的全局变量
__dirname
保存着当前文件所在目录的绝对路径,可以使用__dirname
与文件名拼接成绝对路径
let data = fs.readFileSync(__dirname + '/path');
尽量使用
__dirname
拼接成绝对路径,减少路径bug
path
path模块提供了操作路径的功能
API | 说明 |
---|---|
path.resolve | 拼接规范的绝对路径 常用 |
path.sep | 获取操作系统的路径分隔符,比如windows下就是反斜线 |
path.parse | 解析路径并返回对象。后三个都是该对象的属性 |
path.basename | 获取路径的基础名称 |
path.dirname | 获取路径的目录名 |
path.extname | 获取路径的扩展名 |
//引入path
const path = require('path');
//第二个参数要使用相对路径,如果使用 “/文件”,那就会被当成绝对路径,进行后续的拼接
path.resolve(__dirname, './文件');
http
//1.开启服务
const http = require('http');
//2.创建服务对象
const server = http.createServer((request, response) => {
response.send('hello');
});
//3.监听端口,启动服务
server.listen(端口号, () => {
.....
});
获取请求报文
含义 | 语法 |
---|---|
请求方法* | request.method |
请求版本 | request.httpVersion |
请求路径* | request.url |
url路径* | request(‘具体的url’).parse(request.url).pathname |
url查询字符串* | request(‘具体的url’).parse(request.url).query |
请求头* | request.headers |
请求体 | request.on(‘data’, function(chunk){}) request.on(‘end’, function(){}) |
注意事项:
- request.url只能获取路径以及查询字符串,无法获取url中的域名以及协议的内容
- request.headers将请求信息转换成一个对象,并将属性名都转换成了小写
- 关于路径:如果访问网站的时候,只填写了ip地址或者域名信息,此时的请求路径为 /
- 关于favicon.ico,这个请求是浏览器自动发送的请求
设置响应报文
作用 | 语法 |
---|---|
设置响应状态码 | response.statusCode |
设置响应状态描述 | response.statusMessage(用的少) |
设置响应头信息 | response.setHeader(‘头名’, ‘值’) 头名可以自定义,可以通过setHeader(‘test’, [a,b,c])传入三个test同名请求头 |
设置响应体 | response.write(‘xxx’) response.end(‘xxx’) |
write和end的两种使用情况:
write和end结合使用,响应体相对分散
response.write(‘xxx’);
response.write(‘xxx’);
response.end(‘xxx’); 每一个请求,在处理的时候必须要执行end方法,且只能有一个end
单独使用end 响应体相对集中
response.end(‘xxx’);
一般write写了请求体,end中就不写
资源
简介
- 静态资源:内容长时间不改变的资源,例如图片,视频,css文件,js文件,html文件,字体文件等
- 动态资源:内容经常更新的资源,例如百度网页。
设置资源类型
媒体类型(Multipurpose Internet Mail Extensions或MIME类型)是一种标准,用来表示文档,文件或字节流的性质和格式
mime结构:type/subtype
例如:text/html text/css
网页中的URL
绝对路径
绝对路径可靠性强,而且相对容易理解,在项目中运用较多
形式 | 特点 |
---|---|
http://www.baidu.com | 直接向目标资源发送请求。网站的外链会用到此形式 |
//jd.com | 与页面url的协议拼接形成完整的url再发送请求,大型网站用的比较多 |
/web | 与页面url协议,主机名,端口拼接形成完整的url再发送请求,中小型网站 |
相对路径
相对路径在发送请求时,需要与页面url路径进行计算,得到完整的url后再发送请求
例如:当前页面url为:http://www.baidu.com/course/index.html
形式 | 最终的url |
---|---|
./css/app.css | http://www.baidu.com/course/css/app.css |
js/app.css | http://www.baidu.com/course/js/app.css |
…/img/logo.png | http://www.baidu.com/img/logo.png |
…/…/mp4/show.mp4 | http://www.baidu.com/mp4/show.mp4 |
模块化
介绍
将一个复杂的程序文件依据一定的规则拆分成多个文件的过程就叫模块化
模块的内部数据是私有的,不过模块可以暴露内部数据以使得其他模块可用
好处:
- 防止命名冲突
- 高复用性
- 高维护性
使用
//me.js
function tiemo(){
console.log("tie mo...");
}
function niejiao(){
console.log("nie jiao...");
}
//暴露数据——把tiemo函数暴露
module.export = tiemo;
//1.暴露两个
module.export = {
tiemo,
niejiao,
};
//2.
exports.name = value;
//index.js
//导入模块
const tiemo = require('me.js的路径');
const me = require('me.js的路径');
//调用
tiemo();
me.tiemo();
me.niejiao();
注意:
module.exports
可以暴露任何数据- 不能使用
exports = value
的形式暴露数据,模块内部module
和exports
的隐式关系,exports = module.exports = {}
require
注意事项
- 对于自己创建的模块,导入时路径建议写相对路径,且不能省略
./
和../
- js和json文件导入时可以不用写后缀,c/c++编写的node扩展文件也可以不写后缀,但是一般用不到
- 如果导入其他类型的文件,会以js文件处理
- 如果导入的路径是文件夹,则会检测该文件夹下,package.json文件中main属性对应的文件,如果main属性不存在,或者package.json不存在,则会检测文件夹下的index.js和index.json,如果还是没找到,就会报错
- 导入node.js内置模块时,直接require模块的名字即可
基本流程
- 将相对路径转为绝对路径,定位目标文件
- 缓存检测
- 读取目标文件代码
- 包裹为一个函数并执行,通过
argument.callee.toString()
查看自执行函数 - 缓存模块的值
- 返回
module.exports
的值
包管理工具
概念介绍
包,代表了一组特定功能的源码集合
常见的比如:
- npm
- cnpm
- yarn
npm
npm全程是Node Package Manager,是node.js官方内置的包管理工具
// 查看npm版本
npm -v
基本使用
创建一个空目录,执行npm init
,就会初始化一个包并创建package.json
文件
注意事项:
- package.name不能使用中文,大写,默认值是文件夹的名称。所以文件夹也不能是中文,大写
- version要求x.x.x的形式来定义,默认值是1.0.0
- package.json可以手动创建或修改
- 使用npm init -y或者npm init --yes极速创建package.json
搜索包
- 命令行
npm s 关键字
- 网站搜索
下载安装包
命令:npm install 包名@版本号 / npm i 包名@版本号
生产依赖和开发依赖
类型 | 命令 | 补充 |
---|---|---|
生产依赖 | npm i -S 包名 npm i --save 包名 | -S等效于–save,-S是默认选项。包信息保存在package.json中的dependencies 属性 |
开发依赖 | npm i -D 包名 npm i --save-dev 包名 | -D等效于–save-dev,包信息保存在package.json中的devDependencies 属性 |
全局安装
命令:npm i -g 包名
Windows默认不允许npm全局命令执行脚本文件,所以需要修改执行策略
修改windows的执行策略
- 以管理员身份打开powershell
- 输入:
set-ExecutionPolicy remoteSigned
删除依赖
命令:npm remove 包名 / npm r 包名
npm r -g 包名
:全局删除
设置命令别名
通过配置命令别名可以更简单的执行命令
配置package.json中的scripts
属性
{
....
"scripts":{
"server": "node 文件",
"start": "node 文件",
}
}
配置后可以使用别名执行命令
npm run server
npm run start
补充:
- npm start是项目中常用的一个命令,一般用来启动项目
- npm run有自动向上级目录寻找的特性,
- 对于陌生的项目,可以通过查看scripts属性来参考项目的一些操作
会话控制
HTTP是一种无状态的协议,它没有办法区分多次的请求是否来自同一个客户端,无法区分用户
常见的会话控制方式:
- cookie
- session
- token
cookie
cookie是HTTP服务器发送到用户浏览器并保存到本地的一小块数据
保存在浏览器端的一小块数据,是按照域名划分保存的
浏览器向服务端发送请求时,会自动将当前域名下可用的cookie设置在请求头中,发送给服务端,这个请求头的名字也就cookie
session
session是保存在服务器的一块儿数据,保存当前访问用户的相关信息
两者的区别
- 存放的位置
- cookie:浏览器端
- session:服务器
- 安全性
- cookie是以明文的方式存在客户端的,安全性相对较低
- session存在服务器中,安全性相对较好
- 网络传输量
- cookie设置内容过多会增大报文体积,影响传输效率
- session数据存在服务器端,只是通过cookie传递id,不影响传递效率
- 存储限制
- 浏览器限制单个cookie保存的数据不能超过4k,且单个域名下的存储数量也是有限制的
- session存在服务器中,所以没有限制
token
token是服务端生成并返回给HTTP客户端的一串加密字符串,token中保存着用户信息,更多用在移动端
特点:
- 服务端压力更小。数据存在客户端
- 相对更安全。数据加密,可以避免CSRF(跨域请求伪造)
- 扩展性更强。服务间可以共享,增加服务节点更简单