promise 是为了解决回调地狱的问题。
主要有以下几个方法
- Promise.prototype.then
- Promise.prototype.catch
- Promise.all
- Promise.race
promise 是为了解决回调地狱的问题。
主要有以下几个方法
错误提示的意思是:mongoose模型被重复定义了,这是不允许的
首先,你需要搞清楚require和module.exports的运行机制,建议你看看这篇:http://www.nodeclass.com/articles/37488
.save()和update()
update比find之后save()效率高,因为这样不用读取整个文档。
Mongoose的update是MongoDB的update,但是Mongoose的save可能是MongoDB的插入或是update。
因pmo查询做得辣鸡,需要多次查询合成结果集,查询经常遇到对象数组合并问题(key不存在也要赋值)
如
1 | const test1 = [ |
使用国内 npm 镜像
npm 默认从国外的源(https://registry.npmjs.org/)获取和下载包信息,国内访问速度很不理想。
就像其他很多开源软件都有国内镜像源,npm 也不例外。所以我们可以利用国内镜像源来加速模块安装。
1 | Install |
2.1 expires
2.2 cache-control,优先级高于 expires。
Last-Modified/If-Modified-Since(两个都是时间格式字符串)
与 Last-Modified/If-Modified-Since 不同的是,返回 304 时,ETag 还是会重新生成返回至浏览器。
Last-Modified/If-Modified-Since
Last-Modified/If-Modified-Since要配合Cache-Control使用。
l Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
l If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。
Etag/If-None-Match
Etag/If-None-Match也要配合Cache-Control使用。
l Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
l If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。
1.进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了. ;
2.一个程序至少有一个进程,一个进程至少有一个线程.
3.进程是资源分配的最小单位,线程是程序执行的最小单位。 ;
4.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.
1.线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间。
2.进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;线程是处理器调度的基本单位,但进程不是。
3.进程间是完全独立的个体,多进程环境中,任何一个进程终止不会影响其他进程,而多线程环境中任何一个线程执行exit系统调用,则所有线程退出,最常见的是因某个线程异常导致程序的退出。
4.通信方式,进程间通信(IPC:无名管道,有名管道,消息队列,信号,信号量,共享内存等)较为复杂,线程间可以直接读写进程数据段(如全局变量)来进行通信(需要线程同步和互斥手段的辅助,以保证数据的一致性)。
5.线程比进程轻,不管是创建还是上下文切换,线程的开销都要比进程小。
2—》
进程是系统分配资源的最小单位;线程是CPU调度的最小单位;由于默认进程内只有一个线程,所以多核CPU处理多进程就像是一个进程一个核心
协程是属于线程的。协程程序是在线程里面跑的,因此协程又称微线程和纤程等
协没有线程的上下文切换消耗。协程的调度切换是用户(程序员)手动切换的,因此更加灵活,因此又叫用户空间线程.
原子操作性。由于协程是用户调度的,所以不会出现执行一半的代码片段被强制中断了,因此无需原子操作锁。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
1 三次握手
客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三次握手的一部分。客户端把这段连接的序号设定为随机数 A。
服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK 的确认码应为 A+1,SYN/ACK 包本身又有一个随机序号 B。
最后,客户端再发送一个ACK。当服务端受到这个ACK的时候,就完成了三路握手,并进入了连接创建状态。此时包序号被设定为收到的确认号 A+1,而响应则为 B+1。
2 四次挥手
注意: 中断连接端可以是客户端,也可以是服务器端. 下面仅以客户端断开连接举例, 反之亦然.
客户端发送一个数据分段, 其中的 FIN 标记设置为1. 客户端进入 FIN-WAIT 状态. 该状态下客户端只接收数据, 不再发送数据.
服务器接收到带有 FIN = 1 的数据分段, 发送带有 ACK = 1 的剩余数据分段, 确认收到客户端发来的 FIN 信息.
服务器等到所有数据传输结束, 向客户端发送一个带有 FIN = 1 的数据分段, 并进入 CLOSE-WAIT 状态, 等待客户端发来带有 ACK = 1 的确认报文.
客户端收到服务器发来带有 FIN = 1 的报文, 返回 ACK = 1 的报文确认, 为了防止服务器端未收到需要重发, 进入 TIME-WAIT 状态. 服务器接收到报文后关闭连接. 客户端等待 2MSL 后未收到回复, 则认为服务器成功关闭, 客户端关闭连接.
常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树
因为Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描
哈希索引适合等值查询,但是无法进行范围查询
哈希索引没办法利用索引完成排序
哈希索引不支持多列联合索引的最左匹配规则
如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题
事务具有4个特征,
分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,
分是:未授权读取,授权读取,可重复读取和串行化
http2 来自于GoogleSPDY协议, 相比HTTPS有三大特性
https加密
1.2 身份认证
对称加密的话,要先约定好一个密码,但是我们不能让所有电脑都内置每一个网站的密码,这不现实。非对称加密,也不可能所有电脑都内置每一个网站密码对中的一个,这也不现实。
a. 有个权威机构,他也有个密码对A和B。这个机构能帮人们验明每个域名都是真正属于对应网站的主人。
b. 验证通过后,权威机构用他的密码B对这个网站的域名进行加密,然后把密文交给网站。
c. 所有人电脑上都内置了权威机构的密码A。
d. 用户访问网站时,网站将权威机构加密的密文发给用户。用户用密码A尝试解密。
e. 如果解密成功,就能得到一个域名,比对一下这个域名和当前访问的网址是否一致,就知道这个这个网站是否是经过权威机构认证的。
只是,在真正的过程中,用户并不直接用机构的密码A去解密,而是用密码A计算一个域名的哈希值,通过比对网站给的哈希值,来确认是域名是否经过机构认证。但是原理是和a-e一致的。
Redis是什么?
是一个完全开源免费的key-value内存数据库
通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
Redis缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
总结:服务提供的两大流派.传统意义以方法调用为导向通称RPC。为了企业SOA,若干厂商联合推出webservice,制定了wsdl接口定义,传输soap.当互联网时代,臃肿SOA被简化为http+xml/json.但是简化出现各种混乱。以资源为导向,任何操作无非是对资源的增删改查,于是统一的REST出现了.
进化的顺序: RPC -> SOAP -> RESTful
XSS防范(跨站脚本攻击): * 输入检查* 输出检查* HttpOnly 防止劫取 Cookie
CSRF(跨站请求伪造)攻击的防范: *验证码 *RefererCheck *添加 token 验证 (CSRF重点在请求,XSS重点在脚本)
目录结构
T:/player/index.html(网页入口)
T:/player/main.js
T:/player/package.json
//成功打包的话,会player同级目录生成exe
T:/outplayer/项目名
I just came across this as a really nice and elegant solution:
1 | Math.random().toString(36).slice(2) |
Notes on this implementation:
备用工具