1.assert (断言)
assert 模块提供了一组简单的断言测试集合,用于测试不变量。 该模块是供 Node.js 内部使用的,但可以通过 require('assert') 在代码中使用。 assert 不是一个测试框架,也无意成为通用的断言库。
assert 模块的 API 是锁定的。 这意味着将不会新增或更改任何由该模块实现与公开的方法。
assert 模块的 API 是锁定的。 这意味着将不会新增或更改任何由该模块实现与公开的方法。
2.assert.deepEqual(actual, expected[, message])测试参数是否相等,只比较可枚举的属性,deepEqual()不测试对象的原型、连接符,或不可枚举的属性。
3.assert.deepStrictEqual(actual, expected[, message]) 大多数情况下等同于assert.deepEqual(),但有两个例外。首先,原始值使用严格相等运算符进行比较。其实,对象对比包括严格比较它们的原型。
4.assert.doesNotThrow(block[, error][, message]) 当调用该函数时,他会立即调用block函数,如果block函数抛出错误,并且错误类型与error参数指定的相同,则抛出 AssertionError,如果类型不相同,或者error参数是undedined,则错误传给回调者。
5.assert.equal(actual, expected[, message]) 使用相等运算符(==)来测试 actual 和 expected 参数是否相等。
6.对于一个事件不要设置超过十个监听器,以免发生内存泄漏,但是这个值是可以修改的,order.setMaxListeners(number);
7.HTTPS协议是在HTTP协议的基础上增加了SSL/TLS的握手和数据加密传输,HTTPS模块是专门用于处理家加密访问的
8.去掉多余的空格的jquery函数trim()
9.sream的四种流,readable,writeable,分别为可读流和可写流,duplex为双工流,可读可写。tansform也是双工流,可读可写,但不保留数据相当于一个阀门。
10.pipe()方法可以控制管道数据传输,可以控制将返回的数据源源不断的发送给客户端,然后也可以控制后端压力。
11.koa应用是一个包含一系列中间件generator函数的对象。
12.Node真正的亮点在于建设高性能,高扩展性的互联网应用--因为它能够处理庞大的并且高吞吐量的并发连接。
13.为了避免node.js中异常抛出中断进程的方法是将异常使用回调传递出去(而不是抛出他们,就像在其他环境中一样)。即使一些未处理的异常阻止了程序,依旧有多种对应的解决方案,而且也有很多可用于监视Node进程来执行必要的崩溃后恢复工作的策略和工具,最常见的是forever(确保node脚本持续运行的最流行的工具)模块,或者其他的外部系统工具如upstart and monit。
14.简单的说:使用node,你可以把数据库操作扔到一边并在稍后处理它们,假设他们成功了一样继续执行下去,在开发中哦通常的情况是这样,耗时的操作都是通过回调函数来异步处理,主线程继续往下执行。
15.node.js不适用于cpu密集型操作,需要进行大量且繁琐的数据运算的应用。
16.node.js从来不是用来解决大规模计算问题而创建的,他的出现是为了解决大规模I/O的问题,并且在这一点上做的非常好。
17.判断是否是程序的入口文件有两种方式:
(1)require.main === module(推荐)
(2)module.parent === null
(1)require.main === module(推荐)
(2)module.parent === null
18.require用来加载代码,而exports和module.exports则用来导出代码。
19.exports和module.exports的区别
module.exports初始值为一个空对象{}
exports是指向module.exports的引用
require()返回的是modul.exports而不是exports
20.exports = module.exports = {...}
我们经常看到这样的写法:
exports = module.exports = {...}
上面的代码等价于:
module.exports = {...}
exports = module.exports
我们经常看到这样的写法:
exports = module.exports = {...}
上面的代码等价于:
module.exports = {...}
exports = module.exports
原理很简单:module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,那么通过 exports = module.exports 让 exports 重新指向 module.exports
21.以前,异步编程的方法大概有下面四种,回调函数,事件监听,发布/订阅,Promise对象。
22.而现在es6的异步编程的语法目标,就是让他更像同步编程。
23.promise的出现很好的解决了回调函数嵌套的弊端。
24.设置不包含最后一个元素,element.not(:last-child) {}
25.yield命令会将执行权交给其它函数,从而实现异步。
26.generator函数的next方法具有函数体内外的数据交换和错误处理机制。
next方法返回值的value属性,是generator函数向外输出数据,next方法还可以接收参数,这是向generator函数体内输入数据,作为上个阶段异步任务的返回结果。
27.SSL(Secure Sockets Layer, 安全套接层),及其继任者TLS?(Transport Layer Security,传输安全层)是为网络数据提供安全及数据完整性的一种安全协议。TLS与SSL
在传输层对网络连接进行加密。
为Netscape所研发,用于保障internet上数据传输安全,利用数据加密技术,可确保数据在网络传输过程中不会被截取或窃听。
SSL协议位于TCP/IP协议与各种应用协议之间,为数据通讯提供安全支持,SSL协议可分为两层:
SSL记录协议(SSL Record Protocol):它建立在可靠地传输协议(如TCP)之上,为高层协议提供数据封装,压缩,加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol):他建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份验证,协商加密算法,交换加密密钥等。
SSL协议提供的服务主要有:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器
2)加密数据以防止数据中途被窃取
3)保证数据的完整性,确保数据在传输过程中不被改变。
SSL或者Secure Socket Layer,是一种允许web浏览器和web服务器通过一个安全的连接进行交流的技术。这意味着将被发送的数据在一端被翻译成密码,传送出去,然后在另一端解开密码,再进行处理。这是一个双向的过程,也就是浏览器和服务器都需要在发送数据之前对它们进行加密。
SSL协定的另一个重要方面是认证(Authentication)。这就是说,在你开始试图通过一个安全连接与一个Web服务器交流的时候,这个服务器会要求你的浏览器出示一组证件,通过“鉴定”的方式来证明这就是你所声明的网站。在某些情况下,服务器还会要求你的web浏览器的认证书,证明你就是你所说的那个人。这就是所知的“客户认证”,尽管实际情况中,更多地用在商务-对-商务(B2B)交易,而不是对个人用户。大多数有SSL功能的web服务器不要求客户认证(Client Authentication)。
SSL协定的另一个重要方面是认证(Authentication)。这就是说,在你开始试图通过一个安全连接与一个Web服务器交流的时候,这个服务器会要求你的浏览器出示一组证件,通过“鉴定”的方式来证明这就是你所声明的网站。在某些情况下,服务器还会要求你的web浏览器的认证书,证明你就是你所说的那个人。这就是所知的“客户认证”,尽管实际情况中,更多地用在商务-对-商务(B2B)交易,而不是对个人用户。大多数有SSL功能的web服务器不要求客户认证(Client Authentication)。
28.使用babel-register模块改写require命令后,每当require加载.js,.jsx,.es后缀名的文件,就会先用babel进行转码
但是,使用时必须首先加载
require(
"babel-register"
)
;
29.Node.js等则规定在javascript的回调函数的第一个参数为error对象,这也是他的一个惯例
30.req包含了请求来的相关信息,res则用来返回该请求的响应
req.query:解析后的url中的querystring,如?name=haha,req.query的值为{name: 'haha'}
req.params :解析url中的占位符,如/:name,fangwen /haha,req.params的值为{name: ' haha '};
req.body:解析后请求体,如body-parser,请求体为{"name" : "haha"},则 req.body 为 {name: 'haha'};
31.ejs有三种常用标签,
(1)<% code %>: 运行javascript代码,不输出
(2)<%= code %>: 显示转义后的HTML内容
(3)<%- coede %>:显示原始HTML内容
32.node的开发模式是MVC的,modals(操作数据库的文件),views(视图),controller(router路由控制器)。
33.由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是会话(
session
)。
34.cookie与session的区别
(1)cookie存储在浏览器(有大小限制),session存储在服务端(没有大小限制)
(2)通常session的实现是基于cookie的,即session ID存储于cookie中。
35.express中有两个对象可用于模板的渲染,app.locals 和 res.locals。
36.优先级:res.render传入的对象> res.locals对象 > app.locals 对象,所以app.locals 和 res.locals几乎没有区别,都用来渲染模板,使用上的区别在于:
app.locals上通常挂载常量信息,res.locals上通常挂载变量信息。即每次请求可能的值都不一样。
37.我们是用mongolass这个模块操作mongodb进行增删改查。
38.比较两个mongodb库的优缺点:
1.官方的mongodb库,也叫node-mongodb-native库,
优点:
(1)简单,参照文档即可上手,没有mongoose的schema那些对新手不友好的东西
(2)强大,毕竟是官方库,包含了所有最新的api,其他大部分的库都是在这个库的基础上改造的,包括mongoose。
(3)文档健全。
缺点:
(1)起初至支持 callback,现在支持promise了,和co一起使用好很多,
(2).不支持文档校验
2.mongoose
优点:
(1)封装了数据库的操作,给人的感觉是同步的,其实内部是异步的。
(2)支持promise可结合co使用,也可结合async/await使用,
(3)支持文档校验
缺点:
(1)功能多,复杂,有很多功能一般用不到
(2)较弱的plugin系统,有些方法只支持异步
(3)其他:对新手来说难以理解Schema,Modal,Entry之间的关系,容易混淆toJSON和toObject,以及有带有虚拟属性的情况,永和不用exec的情况以及
直接用then的情况,返回的结果是mongoose包装后的对象,在此对象上修改结果无效等等。
39.mongolass保持了与mongodb一样的api,又借鉴了许多mongoose的优点,同时又保持了精简
40.exec()方法用于检索字符串中的正则表达式的匹配,返回一个数组,其中存放匹配的结果,如果未找到匹配,则返回值为null,
41.path.split(path.sep).pop();
path.sep路径分隔符
path.split()这里是将获取到的路径以路径分隔符为准将字符串分割为字符串数组。
pop()方法的作用是删除并返回数组的最后一个元素。