nodejs项目启动必要知识点总结

nodejs项目技术预研

下面是我做nodejs的小demo的过程中总结的一些对于node项目来说比较重要的知识点

1.技术预研的重要性

分析技术需求,找出技术难点。针对每个技术难点进行攻克

2.BFF层(Backend for Frontend)

浏览器和服务端的中间渲染层,负责组装后台微服务返回的各项数据,组装成前端需要的数据,再返回到浏览器。

3.node主要职责及定位

1.对用户侧提供http服务
2.使用后端RPC服务

RPC 要解决的两个问题:
1.解决分布式系统中,服务之间的调用问题。
2.远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

4. process.argv

可以拿到用户传参,返回的是一个数组,包含用户所有操作(just tip)

5.commonJS模块规范

概括起来就是:
封装好的模块用exports或module.exports导出(推荐后者),在需要调用的组件中用Require引入包模块

Exports和module.exports的区别:后者优先级更高,两者同时存在会覆盖前者,调用者的操作会加在优先级更高者身上

6.类的使用:

子类继承必须用super()来改变this指向(just tips)

7.异步:非阻塞I/O

判断标准:在系统接受输入再到输出期间,能不能接收其他输入。能就是非阻塞,不能就是阻塞。

8.异步:异步编程之callback

格式规范:error-first callback/node-style callback

其实就是错误优先,先传error进去可以节省判断时间(不常用了)

Try/catch里面调用的函数如果是异步的,那么根据事件循环机制是不能够在本次catch中被捕获,catch只能捕获本次事件循环的error事件,异步函数因其特性会在下一轮事件循环中执行。所以容易抛出全局错误

异步流程控制:npm:async.js(不用了)thunk(一种编程范式,不用了 )

9.异步:事件循环

(libuv提供)循环堆栈

10.异步:promise异步编程解决方案

promise有三种状态
pending–正在执行
resolved/fulfilled–成功
rejected–失败
首先进入pending状态,然后根据代码逻辑/数据请求的情况进行判断进入resolved/rejected

resolved状态的promise会回调后面的第一个.then()
rejected状态的promise会回调后面的第一个.catch()
任何一个rejected状态且后面没有.catch的promise,都会造成浏览器/node环境的全局错误(类似上面的第八条)

11.异步:async/await 异步编程方案

Async function是promise的语法糖封装,返回的就是promise函数
异步编程的终极方案-以同步的方式写异步
…await关键字可以暂停async function的执行
…await关键字可以以同步的写法获取promise的执行结果
…try-catch可以获取await所得到的错误,不会出现上面第八条提到的情况

12.http服务

一个完整的网络请求,包含两次http交换:浏览器向http服务器发送请求http包,http服务器向浏览器返回http包

13.http的express模块

核心功能:路由+request/response简化
– request:pathname,query等
– response:send(),json(),jsonp()等

在 Express 框架中,中间件是层叠的,上层中间件处理完当前任务后必须按照约定把处理机会转交给下层中间件(有点像洋葱模型)。调用 next () 函数就是为了达到这一目的。不过next()是普通函数,所以如果调用了异步操作可能无法实现需求(也就是破坏了洋葱模型),这算是express框架的缺点,所以需要koa框架

14.http的koa模块

Express和koa都是权威的http处理库,koa解决了异步操作问题,并舍弃了路由,为了变得更精简。安装koa时可以再安装一个路由中间件(例如:koa-mount)
中间件:

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

并且多了一个**context模块(也就是ctx缩写)**该变量包含request和response,调用方法为:ctx.response和ctx.request.并且利用ctx.status和ctx.body来修改状态码和页面内容

Mount后如果要跟很多中间件的话,不能够像next那样用很多的next function,可以新建一个koa实例挂在mount的第二个参数那里,

Koa实例和express不一样的是koa需要用new koa方法创建

15.RPC调用(Remote Procedure Call远程过程调用)

两台服务器之间的通讯,不一定使用DNS寻址,使用特有服务进行寻址(不过也需要一台寻址服务器来获得目标ip)
应用层协议一般不使用http(该协议主要传输html,json)RPC会使用二进制协议代替json协议(更小的数据包体积,更快的编解码速率),利用下面提到的buffer编解码二进制数据包

基于TCP或UDP协议
(TCP通讯方式:单工通讯(始终只有一方可以通讯),半双工通信(同一时间只能有一方在通讯),全双工通信(双方自由通讯))

16.buffer模块

Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。处理TCP流数据

BE,LE表示大端小端(BE高位在前,LE高位在后)

protocol-buffers模块快速构建buffer

17.net模块(建立多路复用的RPC通道)

用socket代替res/req,代表网络通路中写入和取出的代理对象
写数据用socket.write,读数据用socket.on监听data事件

单双工通道的搭建 easy

全双工通道的搭建

–关键在于应用层协议需要有标记包号的字段

处理以下情况,需要有标记包长的字段
----粘包(同时发送多个包,tcp底层会把他们拼接成一个包(俗称粘包,需要切分))
----不完整包

–错误处理(连接失败,访问超时,访问拒绝)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值