nodejs笔记总结

1.终端常用命令

  • md 创建目录
  • rmdir(rd) 删除目录,目录内没有文档。
  • echo on a.txt 创建空文件
  • del 删除文件
  • rm 文件名 删除文件
  • cat 文件名 查看文件内容
  • cat > 文件名 向文件中写上内容。

2.nvm常用的命令

  • nvm list 查看当前安装的Node.js所有版本
  • nvm install 版本号 安装指定版本的Node.js
  • nvm uninstall 版本号 卸载指定版本的Node.js
  • nvm use 版本号 选择指定版本的Node.js

2.什么是nodejs

  • 1.Node 是一个构建于 Chrome V8引擎之上的一个Javascript运行环境
    • Node是一个运行环境,作用是让js拥有开发服务端的功能
  • 2.Node使用事件驱动、非阻塞IO模型(异步读写)使得它非常的轻量级和高效
    • Node中绝大多数API都是异步(类似于ajax),目的是提高性能
  • 3.Node中的NPM是世界上最大的开源库生态系统(类似于github)

3.服务端js与客户端js区别

  • 1.客户端JS由三部分组成
    • ECMAScript:确定js的语法规范
    • DOM:js操作网页内容
    • BOM:js操作浏览器窗口
  • 2.服务端JS只有ECMAScript
    • 因为服务端是没有界面的
      • ==在nodejs中使用dom与bom的api程序会报错==

4.ES6语法新特性

变量声明let与const

  • let声明的变量不存在预解析
  • let声明的变量不允许重复(在同一个作用域内)
  • 块内部定义的变量,在外部是不可以访问的
  • for循环括号中声明的变量只能在循环体中使用
  • 在块级作用域内部,变量只能先声明再使用
  • const用来声明常量
  • const声明的常量不允许重新赋值
  • const声明的常量必须初始化
  • 变量的解构赋值

    • 数组解构赋值
    1
    2
    3
    4
    5

    // let [a,b,c] = [1,2,3];
    // let [a,b,c] = [,123,];
    // let [a=111,b,c] = [,123,];
    // console.log(a,b,c);
    • 对象解构赋值
    1
    2
    3
    4
    5
    6
    7
    // 对象的解构赋值
    // let {foo,bar} = {foo : 'hello',bar : 'hi'};
    // let {foo,bar} = {bar : 'hi',foo : 'hello'};

    // 对象属性别名(如果有了别名,那么原来的名字就无效了)
    // let {foo:abc,bar} = {bar : 'hi',foo : 'nihao'};
    // console.log(foo,bar
    • 字符串解构赋值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 字符串的解构赋值
    // let [a,b,c,d,e,length] = "hello";
    // console.log(a,b,c,d,e);
    // console.log(length);

    // console.log("hello".length);

    // let {length} = "hi";
    // console.log(length);
  • 字符串扩展

    • includes()

      • 判断字符串中是否包含指定的字串(有的话返回true,否则返回false)
      • 参数一:匹配的字串
      • 参数二:从第几个开始匹配
    • startsWith()

      • 判断字符串是否以特定的字串开始
    • endsWith()

      • 判断字符串是否以特定的字串结束
    • 模板字符串

      • 1
        2
        3
        4
        5
        // console.log('hello world'.includes('world',7));

        // let url = 'admin/index.php';
        // console.log(url.startsWith('aadmin'));
        // console.log(url.endsWith('phph'));
  • 函数扩展

    • 参数默认值

    • 参数结构赋值

      • 1
        2
        3
        4
        // function foo({uname='lisi',age=13}={}){
        // console.log(uname,age);
        // }
        // foo({uname:'zhangsan',age:15});
    • rest参数

      • 1
        2
        3
        4
        5
        6
        7
        // rest参数(剩余参数)
        // function foo(a,b,...param){
        // console.log(a);
        // console.log(b);
        // console.log(param);
        // }
        // foo(1,2,3,4,5);
    • 扩展运算符

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      // 扩展运算符 ...
      function (a,b,c,d,e,f,g){
      console.log(a + b + c + d + e + f + g);
      }
      // foo(1,2,3,4,5);
      let arr = [1,2,3,4,5,6,7];
      // foo.apply(null,arr);
      foo(...arr);
      // 合并数组
      let arr1 = [1,2,3];
      let arr2 = [4,5,6];
      let arr3 = [...arr1,...arr2];
      console.log(arr3);
    • 箭头函数

    • /* 无参无返回函数 */

    • ES6: 将function关键字使用 => 符号代替


  
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//注意点:形参小括号写在 箭头前面,无参时不能省略
let fn1 = ()=>{
console.log('开工大吉');
};
//注意点:形参小括号写在 箭头前面,无参时不能省略
// function foo(){
// console.log('hello');
// }
// foo();

// let foo = () => console.log('hello');
// foo();

//如果函数体只有一行,可以省掉大括号
fn1 = ()=> console.log('开工大吉');
fn1();
注意事项: 1、多个参数必须用小括号包住 2、箭头函数中this取决于函数的定义,而不是调用 3、箭头函数不可以new 4、箭头函数不可以使用arguments获取参数列表,可以使用rest参数代替
  • 类与继承

5.Node模块化

在Node.js中没有window对象,没有DOM,BOM,但是有一个类似的对象global,访问全局成员的时候可以省略global

Node js特点

1.模块化开发

模块化相关的规则:

​ 1、如何定义模块:一个js文件就是一个模块,模块内部的成员都是相互独立(避免了命名冲突)

​ 2、模块成员的导出和引入

如果要导出单个的成员或者比较少的成员,一般我们使用exports导出;

​ 如果要导出的成员比较多,一般我们使用module.exports的方式

​ 这两种方式不能同时使用

1
2
3
4
5
6
7
8
9
10
11
var sum = function(a,b){
return parseInt(a) + parseInt(b);
}

// 导出模块成员
exports.sum = sum;

// 导出成员的另一种方式
module.exports = function(){
console.log('hello');
};

2.fs文件模块(读写文件)

  • 在nodejs中如果想要进行文件操作,就必须引入 fs 这个核心模块
  • 在fs这个核心模块中,就提供了所有的文件操作相关的API
  • 通过读取到的文件其实都是二进制数据, 01 ,但是转化成了16进制
  • 可以通过 toString方法转化为我们看得懂的字符串

1.1-readFile读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//1.导入文件模块

const fs = require('fs');

//2.读取文件

fs.readFile('./data/aaa.txt','utf-8',(err,data)=>{
* 第一个参数:文件路径
第二参数:文件编码 默认utf-8
* 第三参数:回调函数,接收两个参数
error ----
如果读取失败 error就是错误对象
如果读取成功 error就是null
data -----
如果读取成功 data就是读取到的数据
如果读取失败error错误对象
//通过err判断是或有错误发生
if(err){
console.log(读取失败)
//抛出异常,throw的作用就是让node程序终止运行,方便调试
throw err;
}else{
console.log(读取成功
};
});

console.log('11111');

//3.同步读取文件(了解即可,几乎不用,一般在异步的api后面加上Sync就是同步)

let data = fs.readFileSync('./data/aaa.txt','utf-8');
console.log(data);

console.log('2222');

1.2-writeFile写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//1.导入文件模块
const fs = require('fs');

//2.写文件

/**
* 第一个参数:要写入的文件路径
* 第二个参数:要写入的内容/数据
* 第三个参数:文件编码 默认utf-8
* 第四个参数: 异步回调函数
* err: 如果成功,err为null.
如果失败就是错误对象
*/
fs.writeFile('./data/bbb.txt','黑马程序员','utf-8',(err)=>{
if(error){
console.log('写入失败');
}else{
console.log('写入成功');
};
});

6.同步与异步区别

  • 同步会有阻塞线程,异步不会
  • 同步有序执行,异步无序执行
  • 同步没有回调函数,异步有

js从上解析代码流程

  1. 判断是同步还是异步
  2. 如果是同步则立即执行
  3. 如果是异步则不执行,而是放入事件玄幻中(Event Loop)
  4. 所有代码解析完毕之后,开始执行使劲循环中的异步代码

nodejs 异步执行的任务;

  1. 文件 I / o
  2. 网络 I / o

7.http模块(搭建服务器)

  • 搭建一个服务器的目的是服务器可以提供对数据的鼓舞
  • 可以通过使用createServer( ) 方法构建一个web服务器

步骤:

1.导入模块

要使用 HTTP 服务器和客户端,必须 require(‘http’)

const http = require(‘http’);

2.创建服务器

使用createServer()方法构建一个web服务器,返回一个Server实例

参数:回调函数

​ req:request 客户端请求的数据

​ res:response 服务端响应的数据

3.启动服务器

1.1-http 模块搭建服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1.导入模块

const http = require('http');

//2.创建服务器

/*createServer 相当于安装了 phpStudy中的Apache
参数:回调函数
req:request 客户端请求的数据
res:response 服务端响应的数据
*/
let server = http.createServer((req,res)=>{
//服务端每收到一个客户端请求都会执行一次该回调函数,这个函数会执行多次

//req.url:获取客户端请求的路径
console.log('客户端请求的数据' + req.url);

});

//3.启动服务器(相当于点击了phpStuty的开启按钮)

/*
第一个参数:端口号
第二个参数:ip地址 默认不写,就是本机ip(127.0.0.1)
第三个参数
*/
server.listen(3000,'127.0.0.1',(err)=>{
console.log('服务器启动成功');
});

1.2-响应客户端请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//1.导入HTTP模块
const http = require('http');

//2.创建服务器
let server = http.createServer((req,res)=>{
//服务器每收到一次请求都会调用一次这个函数
//req:负责接收客户端请求
//res:负责响应客户端请求

/* 注意:服务器响应给客户端只能是两种数据类型: 一:文本 二:二进制 否则程序报错 */
res.end('hello world');
});

//3.开启服务器
server.listen(3000,(err)=>{
console.log('服务器开启成功');
});

1.3-根据不同请求响应不同数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//1.导入HTTP模块
const http = require('http');

//2.创建服务器
let server = http.createServer((req,res)=>{
//服务器每收到一次请求都会调用一次这个函数
//req:负责接收客户端请求
//res:负责响应客户端请求

console.log(req.url);//获取到的内容是127.0.0.1:3000后面的内容,url路径通常以'/'开头
if(req.url == '/a'){
res.end('hello world');
}else if(req.url == '/login'){//

//设置服务器响应头: 作用:服务端告诉客户端,我响应给你的数据是什么类型
res.writeHead(200,{
'Content-Type':'text/plain;charset=utf8' //text/plain:普通文本
});

res.end('这是登录页');
}else if(req.url == '/'){ //如果本次没有请求路径(127.0.0.1:3000),通常表示首页

res.writeHead(200,{
'Content-Type':'text/html;charset=utf8' //text/html文本
});
res.end('<h1>这是首页</h1>');
}else{
//如果客户端请求了服务端无法识别的路径,一般响应404
res.end('404 not found');
};
});

//3.开启服务器
server.listen(3000,()=>{

console.log('服务器开启成功');

})

1.4-http响应客户端HTML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//1.导入http模块
const http = require('http');

const fs = require('fs');

//2.创建服务器
let server = http.createServer((req,res)=>{

console.log(req.url);
//一般情况下,如果返回的是文件二进制数据,浏览器会自动识别文件格式解析加载

if(req.url == '/'){// 请求路径为/,返回首页
fs.readFile('./data/index.html',(err,data)=>{
if(err){
throw err;
}else{
console.log(data);
res.end(data);
};
});
}else if(req.url == '/login.html'){
fs.readFile('./data/login.html',(err,data)=>{
if(err){
throw err;
}else{
res.end(data);
};
});
}else if(req.url == '/image.jpg'){
fs.readFile('./data/image.jpg',(err,data)=>{
if(err){
throw err;
}else{
res.end(data);
};
});
}else{
res.end('404 not found');
};
});

//3.开启服务器
server.listen(3000,(err)=>{
console.log('服务器启动成功');
});

8.Nodejs路径

  • node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命名的文件夹路径

    在服务端开发中,一般不要使用相对路径,而使用绝对路径

  • 解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径

    • __filename:当前js文件所在目录的绝对路径
    • __dirmame:当前js文件的绝对路径

console.log(dirname);
console.log(
filename);

buffer对象

buffer是一个缓冲区,主要用于操作二进制的数据流,用法跟数组非常的相识

1.创建一个buffer实例

使用new操作符,有四种方法创建一个Buffer实例

  • new Buffer(size),创建一个指定大小的buffer
1
2
var buf = new Buffer(10);
console.log(buf); //<Buffer 00 00 00 00 00 00 00 00 00 00>
  • new Buffer(array),根据一个字节数组来创建一个buffer
1
2
var bf=new Buffer([1,2,3]);
console.log(bf); //<Buffer 01 02 03>
  • new Buffer(str[,encoding]),根据一个字符串和编码格式创建buffer,不指定编码时默认使用utf8
1
2
3
4
5
var bf1=new Buffer('miao','utf-8');
console.log(bf1);
for(var i=0;i<bf1.length;i++){
console.log(String.fromCharCode(bf1[i]));
}
  • new Buffer(buffer),根据buffer实例创建一个新的buffer

buf.write()方法

1
buf.write(string[, offset][, length][, encoding]) //往Buffer对象中写入数据

uf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:

  • string,待写入的字符串对象
  • offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0
  • length,要写入的字节数
  • encoding,代谢如字符串的编码格式,默认为utf8

buf.toString()方法

1
2
3
4
5
6
7
8
9
buf.toString([encoding], [start], [end]) // 根据 encoding参数(默认是 'utf8')返回一个解码的 string 类型

var bf=new Buffer("xiaoxu");
console.log(bf);
console.log(bf.toString());

var bf2=new Buffer("小徐");
console.log(bf2);
console.log(bf2.toString('utf-8',3));

如果不知道开始位置,则将字符全部返回,如果指定了开始位置和结束位置则按指定的返回,在上面实例中,因为一个中文占3个字节,所以在bf2这个实例中,我们指定从第三个位置开始,则返回的是徐这个汉字

buf.toJSON()

1
//返回一个 JSON表示的Buffer实例。JSON.stringify将会默认调用来字符串序列化这个Buffer实例

buf.slice()方法

buf.slice([start], [end]) ://返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址,注意:修改这个新的buffer实例slice切片,也会改变原来的buffer

原文:大专栏  nodejs笔记总结


猜你喜欢

转载自www.cnblogs.com/petewell/p/11584800.html
今日推荐