node简介

1.命令行窗口
window+r—>cmd打开命令行窗口
常用指令: dir 列出当前目录下的所有文件
cd 后面跟目录名,进入指定的目录下 再追加dir,就会显示该目录下所有目录
f: 转到F盘
md 后面跟目录名,创建一个文件夹
rd 后面跟目录名,删除一个文件夹
node 后跟文件名,打开js文件
直接输入文件名–打开文件
-目录:
. 表示当前目录
… 表示上一级目录
盘符:切换磁盘的根目录
环境变量(windows系统中的变量):计算机–右键–属性–高级系统设置–环境变量–一般改用户变量
path -当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,
如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止,如果没找到会报错。
跟函数的作用域链类似,从内往外找。
所以我们可以将一些经常需要访问的程序和文件路径添加到path中,
这样我们就可以在任意位置来访问这些文件和程序了(不用进入指定文件夹目录下就能调用)。
:文件目录—追加在path路径后,即给该文件配置环境变量

2.进程和线程
进程:负责为程序的运行提供必备的环境 (桌面底部,右键–任务管理器–进程)
进程相当于工厂中的车间
线程:计算机中的最小的计算单位,负责执行保存到进程中的程序
线程相当于工厂中的工人
单线程:js是单线程
多线程:

3.Node简介 (node本意“节点”)
定义:Node.js是一个能够在服务器端运行JavaScript的开放源代码,跨平台的JavaScript运行环境。
浏览器(客户端)运行:之前的js是在浏览器(客户端)运行
服务器端(后端/系统)运行:
Node采用Google开发的V8引擎运行js代码,使用 事件驱动、非阻塞 和 异步I/O模型等技术来提供性能,可优化应用程序的传输量和规模。
瑞安.达尔—Node.js之父
I/O阻塞程序运行
Node的用途:1、Web服务API,比如REST
2、实时多人游戏
3、后端的web服务,例如跨域、服务器端的请求
4、基于web的应用
5、多客户端的通信,如即时通信
node最大特点—单线程,Node处理请求时是单线程,但是在后台拥有一个I/0线程池
node可以执行js文件:进入文件目录下 node 文件名

4、Node整合webstorm

5、模块化: 01.如果程序设计的规模达到了一定程度,则必须对其进行模块化
02.模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制
03.CommonJS的模块功能可以帮我们解决该问题

ECMAScript标准的缺陷: 没有模块系统
标准库较少
没有标准接口
缺乏管理系统
CommonJS规范:
01.CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷。
02.CommonJS规范为JS指定了一个美好的愿景,希望js能够在任何地方运行。
03.CommonJS对模块的定义十分简单: 模块引用 模块定义 模块标识
模块:01.在Node中,一个js就是一个模块
在Node中,通过require()函数来引入外部的模块。
require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,
这里的路径,如果使用相对路径,必须以.或…开头
require("./02.modul")
使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
02.在Node中,每一个js文件中的js代码都是独立运行在一个函数中,
而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
我们可以通过 exports() 来向外部暴露变量和方法
只需要将需要暴露给外部的变量或方法设置为exports的属性即可
例如: exports.x=“我是。。。”
直接在全局中var一个变量,污染全局作用域(环境);
模块的标识:01.模块标识其实就是模块的名字,也就是传递给require()方法的参数,
它必须是符合驼峰命名法的字符串,或者是以. …开头的相对路径,或者绝对路径
02.模块的定义十分简单,接口也十分简洁。每个模块具有独立的空间,他们互不干扰,在引用时也显得干净利落。
模块分成两大类: 核心模块:由node引擎提供的模块。
核心模块的标识就是,模块的名字
文件模块:用户自己创建的模块
文件模块的标识就是文件的路径(绝对路径、相对路径)
相对路径要使用.或…开头

6.global:在node中有一个全局对象,global,它的作用和网页中window类似
在全局中创建的变量都会作为global的属性保存;
在全局中创建的函数都会作为global的方法保存;
arguments.callee 这个属性保存的是当前执行的函数对象
function (exports, require, module, __filename, __dirname) {
var a=10;
console.log(arguments.callee+ “”)
}

实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,
    同时传递进了5个实参(exports, require, module, __filename, __dirname)
 exports     该对象用来将变量或函数暴露到外部
 require     函数,用来引入外部的模块
 module      代表的是当前模块本身,exports就是module的属性
             console.log(module.exports==exports)  //true
             既可以使用exports导出,也可以使用module.exports
 __filename  当前模块的完整路径
 __dirname   当前模块所在文件夹的完整路径

7.exports 和 module.exports

  • 通过exports只能使用.的方式来向外暴露内部变量
    exports.xxx = xxx
  • module.exports 既可以通过.的形式,也可以直接赋值
    module.exports.xxx = xxx
    module.exports = {}

8.包(package) 简介:
01.CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具;
02.CommonJS的包规范由 包结构 和 包描述文件 两个部分组成;
包结构:用于组织包中的各种文件
包描述文件:描述包的相关信息,以供外部读取分析
包结构:包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
package.json 描述文件(必须有) json文件内不能写注释
bin 可执行二进制文件
lib(库) js代码
doc 文档
test 单元测试
dependencies 依赖
devDependences 开发依赖

9.npm 简介
npm (Node Package Manager) node包管理器
CommonJS包规范是理论,NPM是其中一种实践。
对于Node而言,NPM帮助其完成了第三方模块的发布,安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
NPM命令:
npm -v -----查看版本
npm version ----查看所有模块的版本
npm ------帮助说明
npm search 包名 ----搜索包模块
npm install 包名 ----在当前目录安装包 (install可简写成i)
npm install 包名 -g ----全局模式安装包 (此处的g就是global)(注意:全局安装的包一般都是一些工具)
IDEA里建包,左下方Terminal—进入要建包的目录下—输入npm install 包名—建成,在node_modules library root目录下
npm remove 包名 ----删除一个模块 (remove可简写成r)
npm install 文件路径 ----从本地安装
npm install 包名 -registry=地址 —从镜像源安装 (npm install cnpm -g --registry=https://registry.npm.taobao.org 淘宝镜像)
npm config set registry 地址 —设置镜像源
npm install 包名 --save ----安装包并添加到依赖中
npm install 下载当前项目所依赖的包(从网上下载下载项目时,需先下载包才能运行)
npm install nodemon -g —安装此插件可以实现前台、后台、命令行同步修改(全局安装)
(调用文件— nodemon 文件名)
npm install bootstrap@4.6.0 bootstrap降版本
npm install -g @vue/cli 全局安装vue脚手架

10.配置 cnpm (其中的c表示China)
http://r.npm.taobao.org/ 淘宝镜像网址

11.Node搜索包的流程
通过npm下载的包都放到node_modules文件夹中,
通过npm下载的包,直接通过包名引入即可。例如:var math=require(“math”); var express=require(“require”);
node在使用模块的标识(名字)来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块;
如果有则直接用,如果没有则去上一级目录的node_modules中寻找;
如果有则直接用,如果没有则再去上一级目录的node_modules中寻找,直到找到为止;
直到找到磁盘的根目录,如果依然没有,则报错。

12.Buffer缓冲区
01.从结构上看,Buffer非常像一个数组,它的元素为16进制的两位数。
数组中不能存储二进制文件,而Buffer就是专门用来存储二进制数据的。
02.实际上,一个元素就表示内存中的一个字节。
03.实际上,Buffer中的内存不是通过JavaScript分配的,而是在底层通过c++申请的。
04.也就是我们可以直接通过Buffer来创建内存中的空间。
使用Buffer不需要引入模块,直接使用即可。
在Buffer中存储的都是二进制数据,但是都以16进制的形式来显示的。
var str =“Hello Atryighj”;
//将一个字符串保存到Buffer中
var buf=Buffer.from(str); ------将一个字符串转换为Buffer
console.log(buf);
Buffer中每一个元素的范围是从00 - ff (换成十进制:0 - 255)
00000000 - 11111111
计算机 一个0 或 一个1 我们称为1位(bit)
8bit = 1byte(字节)
1024byte = 1kb
1024kb = 1mb
1024mb = 1gb
1024gb = 1tb
Buffer中的一个元素,占用内存的一个字节

Buffer的大小一旦确定,则不能修改。Buffer实际上,是对底层内存的直接将操作。

创建Buffer:

  1. Buffer.alloc(size) 相比较于allocUnsafe(size),alloc使用的更多,避免数据泄露
    alloc(原意:分配)
    创建一个10个字节的buffer
    var buf2 = Buffer.alloc(10);
  2. Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据。
    var buf3 = Buffer.allocUnsafe(10);
    buf.toString();----将缓冲区的数据转换成字符串,括号内可以写进制数

13.同步文件写入
fs 文件系统(File System): 文件系统简单来说就是,通过Node来操作系统中的文件。
01.在Node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送给远程的客户端;
02.Node通过fs模块来和文件系统进行交互;
03.该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互;
04.要使用fs模块,首先需要对其进行引入;fs是核心模块,直接引入,不需要下载。
-const fs = require(“fs”);

同步 和 异步 调用:
01.fs模块中所有的操作都有两种形式可供选择,同步(带Sync) 和 异步(不带Sync);
02.同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码;
03.异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数(callback)将结果返回。

同步文件的写入:
01.打开文件:
引入: fs.openSync(path[, flags[, mode]])
参数: path 要打开文件的路径(相对路径)
flags 打开文件要做的操作的类型 (r—只读的 w—可写的)
mode 设置文件的操作权限,一般不传
返回值:该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作。
var fd=fs.openSync (“hello.txt”,“w”);
console.log(fd);
02.写入内容:
fs.writeSync(fd, string[, position[, encoding]])
参数: fd 文件的描述符,需要传递要写入的文件的描述符
string 要写入的内容
position 写入的起始位置
encoding 写入的编码,默认utf-8
position 和 encoding 两个参数一般都不用传
向文件中写入内容 fs.writeSync(fd,“今天天气真不错”)

03.保存并关闭:
关闭文件(节省内存空间)
fs.closeSync(fd) fd要关闭的文件的描述符

14.异步文件写入:

  1. 打开文件
    引入fs模块,打开文件 fs.open(path[, flags[, mode]], callback)
    注意:异步调用的方法,结果都是通过回调函数的参数返回的。
    // 引入fs模块
    var fs = require(“fs”);

//打开文件
fs.open(“hello2.txt”,“w”, function(err,fd){
//判断是否出错
if(!err){
02.如果没有出错,则对文件进行写入操作
fs.write(fd, “这是异步写入的内容”, function(err){
if (!err){
console.log(“写入成功”)
}
})
03.关闭文件
fs.close(fd,function(){
if(!err){
console.log(“文件已关闭”)
}
})
}else{
console.log(err)
}
});

15.简单文件写入:
异步: fs.writeFile(file, data[, options], callback)
file 要操作的文件的路径
data 要写入的数据
options 选项,可以对写入进行一些设置
options一般都是以对象作为参数的,对象{}
encoding 默认utf-8
mode 默认0o666
flag 默认 w 打开文件用于写操作,如果不存在则创建,如果存在则截断
r 读取文件,文件不存在则出现异常
a 打开文件用于追加,如果不存在则创建
callback 当写入完成以后,执行的函数
同步:fs.writeFileSync(file, data[, options])
file
data
options
异步写入案例:
//引入fs模块 var fs = require(“fs”);
path可以是绝对路径也可以是相对路径
fs.writeFile(“hello3.txt”,“这是通过writeFile写入的内容”,{ flag:“w”},function (err) {
if (!err){
console.log(“写入成功”)
}else{
console.log(err);
}
})

//往桌面文件写入内容 C:\Users\13099\Desktop
//路径写法:C:\Users\13099\Desktop\hello.txt 或 C:/Users/13099/Desktop/hello.txt
fs.writeFile(“C:\Users\13099\Desktop\hello.txt”,“这是通过writeFile写入的内容”,{flag:“w”},function(){
if(!err){
console.log(“写入成功”)
}else{
console.log(err)
}
})

16.流式文件写入
同步、异步、简单文件写入都不适合大文件的写入,性能较差,容易导致内存溢出。

流式文件写入:
var fs = require(“fs”);
创建一个可写流:
fs.createWriteStream(path[, options]) 可以用来创建一个可写流
path 文件路径
options 配置的参数(一般可省略不写)

var ws=fs.createWriteStream(“hello4.txt”);
可以通过监听流的open 和 close 事件,来监听流的打开和关闭

绑定事件: on 和 once
on(事件字符串,回调函数) 可以为对象绑定一个长期有效的事件
once /one(事件字符串,回调函数) 可以为对象绑定一个一次性事件,该事件将会在触发一次以后自动失效

ws.once(“open”,function(){
console.log(“流打开了”);
})
ws.once(“close”,function(){
console.log(“流关闭了”);
})

//通过ws向文件中输出内容
ws.write(“通过可写流写入文件内容”);
ws.write(“134343”);
ws.write(“taoxinglong”);
ws.write(“rytyteut”);

//关闭流
ws.end();

17.简单文件读取

tcp 和 http 都是网络传输协议:
tcp位于传输层,http 位于应用层,应用层高于传输层;
tcp仅仅用来传输数据,不会对数据进行包装和处理,数据传输安全性很好
http对数据进行包装
tcp可以生成客户端和服务端,可以进行双向通信,可以是客户端向服务端发送请求,但是服务端不理它;
也可以是客户端发送请求,服务端回复了100次;也可以反向操作
http必须客户端发送请求,然后服务端只要接收到客户端的请求,必须响应并且返回。
net模块基于TCP协议,是一个底层的传输协议,我们只能用它实现基于命令行工具的客户端和服务器
http模块,基于http协议,实现基于BS构架的应用(浏览器和server)

socket
传输层,socket,应用层
socket 长连接,服务器和客户端的连接,只要没有人退出,就会一直保持
短连接,ajax,客户端发送一次请求,服务端做一次响应
socket的实现:net模块 websocket(第三方插件,使用时需要安装)

websocket实现的具体步骤:
npm install nodejs-websocket 加载websocket插件
01.前后端建立连接:
-搭建socket服务器 createServer()
-前端进行连接, new Websocket(‘ws://localhost:8080’)
ws.onopen 连接成功触发

02.前后端进行数据交互:
-前端往后端主动发数据 ws.send()
-后端往前端发数据 ws.onmessage = function(data){}

03.前后端断开连接
ws.on(“close”)

跨域解决方案:
-cors
跨域资源共享,由一系列http头组成,http头决定浏览器是否阻止前端获取跨域请求的响应
cors提供了web接口,给服务器权限去决定是否允许这种跨域访问
兼容性不好,ie10以下不支持
cors既支持get请求,也支持post请求
express内置了cors中间件,通过安装和配置cors中间件,来很方便的解决跨域问题
01.npm install cors
02.const cos = request(“cors”)
03.在路由之前调用app.use(cors()) 配置中间件
-jsonp
利用了script标签没有跨域限制的漏洞,来达到和后端通讯的目的,
当通讯的时候,会创建一个script元素,地址指向第三方api,类似于
<script src="http://127.0.0.1:4000/api/et?id=123&name=“张三”>
并提供了一个回调函数来接收数据,只支持get,不支持post delete等等
jsonp实现步骤:01.获取客户端发过来的回调函数的名字;
02.得到通过jsonp形式发给客户端的数据 ;
03.根据前两步所得到的数据,拼接出一个函数调用的字符串;
04.把第三步拼出来的字符串,响应给客户端进行解析
连接mysql数据库:
01.安装操作mysql数据库的第三方模块(mysql)
npm install mysql
02.通过mysql模块连接到mysql数据库
03.通过mysql模块执行sql语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值