nodejs学习笔记

概要

cookies
replace中正则的坑
数组越界及undefined的大小问题
dom的效率 dom方式设置元素的兼容性
html中js文件的加载顺序
excel文件的BOM+utf-8编码
post默认提交form或页面变量
redis hmset hgetall
jquery重复绑定同一个动作不会失败
弹出子页面modal
echarts设置connect、光标信息、重复legend grid设置页边距、y:-300设置位置不可见
散列图设置 series.type:”scatter” data为单个坐标点
array.splice()语法
关于async
console.time() console.timeEnd()
mongodb stream
 

1、操作cookies

express提供了bodyParser来操作cookies和sessions,不过通过jQuery操作cookie更方便:

在html中添加cookies.js的引用:

<script src="plugins/jquery.cookie.js"></script>

 

在js中去cookie:

var preData = $.cookie("reportPageInfo");

设置cookie的值:

$.cookie("reportPageInfo", JSON.stringify(preData), {expires:30});

 

2、string.replace()的问题

string.replace()中第一个参数为想要被替换的对象,但是replace的默认机制是只替换一次,如果要处理的字符串中存在多个需替换的字符,最好使用正则表达式并指定全局替换:

> "2015/12/20".replace(/\//g, '')

'20151220'

 

3、数组越界问题与undefined的大小

不知道是不是js通性,在nodejs中,数组下标越界时,不会提示错误,而是返回undefined,这样如果不确定算法的边界条件,就可能产生一系列预想之外的结果。

> l1 = [1, 2, 3, 4]

[ 1, 2, 3, 4 ]

> l1[5]

undefined

 

即使undefined作为数组下标,仍然不会出错,而是返回undefined。目前对js了解不深,但是感觉这样的语法有点不够严谨。

> l2=[]

[]

> l2[l1[66]]

undefined

 

undefined是个特殊的对象:

> undefined > 0

false

> undefined < 0

false

> undefined == 0

false

> undefined == 345

false

> undefined > 345

false

> undefined < 345

false

> undefined > 'erwtSD'

false

> undefined < 'erwtSD'

false

> undefined == 'erwtSD'

false

> undefined > ''

false

> undefined < ''

false

> undefined == ''

false

无论与什么类型比较,undefined都返回false,在if...else...结构中,配合数组越界问题,即使程序正常执行了,也很难确定程序是按照预想逻辑执行的。

可能需要结合||排除undefined干扰。

 

4、DOM的效率及兼容性

通过DOM直接操作页面元素时,页面元素的每次改变都会触发页面整体重新渲染,即使是改变元素所属类。因此DOM方式效率较差。

可通过在DOM对象中完成全部操作,再一次执行。

关于兼容性,在实践中DOM方式创建的元素在Chrome中可以正常显示,FireFox中则TextNode内容无法显示,换用jquery方式设定后恢复正常,不知是否有其他问题。

 

5、HTML中文件加载顺序

 HTML中文件按照书写顺序先后加载,如果先加载的js文件需要用到后加载的js文件内容,则会找不到所需内容。

HTML中直接加载HTML:

<% include ./../../include/footer.html %>

 

6、Excel文件编码

Excel文件内容的编码为BOM+utf-8,如果写入空白Excel文件中的字符只设定了utf-8编码而没有BOM,则同样会出现乱码。

BOM:'\uFEFF’

 

7、setInterval与clearInterval

使用轮询方式开始socket监听之后,如果不关闭,轮询在方法结束后仍会存在,影响进度条判断,需要在使用完毕后关闭轮询。

setInterval(func, time);方法会返回一个生成的轮询对应的id,在关闭轮询时,将这个id传给clearInterval即可。

clearInterval(socketID);

 

8、post默认提交form或页面变量

当HTML页面中存在form时,如果ajax.post方法没有参数,可能会将页面内容(全局变量)作为参数进行传递。如果全局变量中内容过大,可能导致request entity too large错误。

 

9、redis操作

node中设置redis值:
设置键值对形式值:client.hmset(label, key, value, callback)
取得键值对值:client.hgetall(label, callback)  取得结果为json格式数据,可以直接取对应key的值
 
10、jQuery重复绑定同一个动作不会失败
jQuery的click、focus、change等方法,对同一个元素进行多次绑定时,每次绑定的方法不会覆盖前次绑定的方法,会在事件被触发后连续执行。重复绑定可能会造成同一个操作被多次执行。最好每次绑定之前都能确定不会扩大影响,或者先进行解绑。
 
11、子页面modal
暂时只知道如何设定及控制显式隐藏,实现原理还不清楚。
$("#modalID").modal("show");
 
12、echarts图像联动设置
在图像绘制完成后,通过connect方法将当前图像对象与所有其他对象connect,每个对象都要绑定一次,来实现图像联动。
如果需要设置一个legend来控制所有图像,则在所有图像中都需要有包括全部图形的legend及对应的series项,serises项的data可以为空,隐藏不需要的legend后,可通过保留的legend控制对应的图形显式。
 
通过option.tooltip.formatter设置图像光标信息:

option.tooltip.formatter = function(params) {
  var res = params[0].name + '<br/>';
  res += params[0].seriesName + " : " + params[0].value;
  return res;
}

 

设置legend的y属性,隐藏legend

{legend: {

    y: -300,
    data: createConnectedSeriesName(obj, data)

  }

}

 

13、散列图设置

xAxis与yAxis的type都为"value",在series中所有数据的type都是"scatter",数据的data部分每个元素都是一个包含横纵坐标的点,因此不需要设定xAxis的data部分。

 

14、关于array.splice()

splice方法可用于插入元素、删除指定位置的元素,用法为:

arrayObject.splice(index,howmany,item1,.....,itemX)

 

index为数组下标,第二个参数为删除元素的个数,设置为0时,会在指定元素之后插入第三个参数开始的指定内容。

 

15、关于流程控制--async

async.waterfall
顺序执行几个函数,后一个可以接收前一个的回调返回值作为参数,最后一个函数的回调返回则是waterfall方法的返回值。
 
async.mapSeries(array, iterator, callback)
以array中的元素为参数,顺序执行iterator方法,在iterator方法中通过callBack(null, item)的方式返回执行结果,最后的callback中,数据部分是按照执行顺序排列的返回结果的数组。
 
async.mapLimit(arr, limit, iterator, callback)
类似mapSeries,但是可以并行limit个
 
async.parallell
并行执行几个函数,但是函数必须显示定义好,目前为止感觉不太实用,可用mapLimit替代。
 
16、js代码执行时间统计

console.time("label1");
...
console.timeEnd("label1");

统计两者之间的代码执行时间,单位为毫秒。time与timeEnd的参数必须一一对应,否则会报错找不到何时开始或终止。

 

17、mongoose.stream

mongoose中find方法将结果转换为Query对象返回,当返回结果数据量较大时可能会逼近nodejs引擎的内存上限,使程序终止。

mongoose.stream方式将查询结果每次返回一条,相对而言可提高效率。

 1 var stream = table.find(query, projection).sort({
 2     ct: 1,
 3     duk: 1
 4 }).lean(true).stream();
 5 stream.on('data', function(singleRec) {
 6     datas.push(singleRec);
 7 }).on('error', function(err) {
 8     callBack(err, null);
 9 }).on("close", function() {
10     console.log("rec length:", datas.length);
11     callBack(null, datas);
12 });

 

posted @ 2015-12-20 11:52  harelion  阅读(624)  评论(0编辑  收藏  举报