Nodejs开发

测试

stub 桩代码(stub)就是在某些组件或模块中,模拟某些功能的代码。桩代码(stub)的作用是占位,让代码在测试过程中顺利运行。stub是用于模拟一个组件或模块的函数或程序,只用于模块的行为。测试时,stub可以为函数调用返回模拟的结果。可以用stub去模拟一个方法,从而避免调用真实的方法,使用stub还可以返回虚构的结果,可以配合断言使用stub。在单元测试中,Stub是完全模拟一个外部依赖,而Mock常用来判断测试通过还是失败。
用stub模拟一个读取文件:

  
 var fs = require('fs');
      var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb)

      {

          return cb(null);

      });

      expect(writeFileStub).to.be.called;

      writeFileStub.restore();

jasmine测试框架

测试金字塔
测试HTTP接口用例时,底层的单元测试应该远比上层的端到端测试要多。
很多单元测试,分别测试各个模块(依赖需要stub)
较少的集成测试,测试各个模块之间的交互(依赖不能stub)
少量端到端测试,去调用真正地接口(依赖不能stub)

socket.connect参数顺序

创建TCP客户端的坑之connect的参数顺序是先port再host:

var net = require('net');
var HOST = '127.0.0.1';
var PORT = 8888;
var client = new net.Socket();
client.connect(PORT, HOST, function() {
    console.log('CONNECTED TO: ' + HOST + ':' + PORT);
    // 建立连接后立即向服务器发送数据,服务器将收到这些数据 
    client.write('message');
});

缓存

nodejs通过文件名缓存加载过的模块,这里是全局缓存,不是页面内缓存。

grpc

安装grpc-tools
$ sudo npm install grpc-tools -g
把proto文件生成js文件
$ /usr/local/lib/node_modules/grpc-tools/bin/protoc --js_out=import_style=commonjs,binary:. --grpc_out=. --plugin=protoc-gen-grpc=/usr/local/lib/node_modules/grpc-tools/bin/grpc_node_plugin *.proto

不同操作系统平台下需要重新下载grpc,即重新执行 npm install grpc

http参数

参数名是区分大小写的,不存在的参数值是undefined
取get地址?后面的传参
var id=req.query.id;
取rest路径中的参数
var id = req.params.id;
取post时json对象中的参数
id=req.body.id;

http响应内容重写

router.get('/', function(req, res, next) {
    var content=getNowFormatDate();
    //重写,去掉了其它的头
    res.connection.write('HTTP/1.1 200 \r\n\r\n' + content, 'ascii', function(){
        res.connection.emit('end');
    });
    
    //res.send(content);
});

function getNowFormatDate() {
    var date = new Date();
    var seperator1 = "-";
    var seperator2 = ":";
    var currentdate = date.getFullYear() + seperator1 + addZero(date.getMonth() + 1) + seperator1 + addZero(date.getDate())
        + " " + addZero(date.getHours()) + seperator2 + addZero(date.getMinutes()) + seperator2 + addZero(date.getSeconds());
    return currentdate;
}

function addZero(num) {
    if (num >= 0 && num <= 9) {
        num = "0" + num;
    }
    return num;
}

express框架

express项目的目录结构:app.js, package.json, bin/www, public, routes, views。
express常用函数:express.Router路由组件,app.get路由定向,app.configure配置,app.set设定参数,app.use使用中间件。

如何保证你的 cookie 安全?如何阻止 XSS 攻击?
XSS 攻击是指攻击者向Html页面里插入恶意 JavaScript 代码。

为了防止攻击需要对 HTTP header 里的 set-cookie 进行处理:
HttpOnly – 这个属性帮助防止跨站脚本攻击,它禁止通过 JavaScript 访问 cookie。
secure – 这个属性告诉浏览器,仅允许通过 HTTPS 协议访问 cookie。
所以需要做的是在请求头里写 Set-Cookie: sid=; HttpOnly。
若使用 Express 框架,可以使用 express-cookie-session组件,它会默认做出上述防止 XSS 攻击的设置。

express中请求超时后出现重复请求的问题

有3种解决办法:
1.httpserver设置超时函数

var app = express();
var http = require('http');
var server = http.createServer(app);
server.on('timeout', onTimeout);
function onTimeout(err) {
}

2.加大超时时间
server.timeout=10*60*1000;
3.request或response设置超时处理方法

router.post('/xxx',function(req,res,next){
req.setTimeout(240000,function () {
});
}

http://blog.csdn.net/puncha/article/details/9378197

socket超时

var socket = new net.Socket(); 创建后
socket.setTimeout(10 * 1000, function () {
if(!idle) {
console.log(‘timeout not idle’);
if (callback) {
callback(false, {message: ‘请求超时’});
callback = null;
}
}else{
console.log(‘timeout idle’);
}
});
不执行connect或write,10秒后会打印timeout idle。
等待9秒后再执行connect,如果connect很久,会在connect开始10秒后打印timeout not idle。
即创建socket和connect或write会开始新一轮超时计时。但不能多次设置settimeout,会引发emit数量警告。
idle为自定义的状态,在connect或wirte时设置idle=false。

安装最新稳定版本
https://segmentfault.com/a/1190000007542620

淘宝NPM镜像CNPM
http://npm.taobao.org/
npm install -g cnpm –registry=https://registry.npm.taobao.org

node中使用redis

    var redis = require("redis"),
    client = redis.createClient();

    client.set("foo_rand000000000000", "some fantastic value");
    client.get("foo_rand000000000000", function (err, reply) {
        console.log(reply.toString());
    });
    client.end();

时序攻击(timing attack)

时序攻击属于侧信道攻击/旁路攻击(Side Channel Attack),侧信道攻击是指利用信道外的信息,比如加解密的速度/加解密时芯片引脚的电压/密文传输的流量和途径等进行攻击的方式,一个词形容就是“旁敲侧击”。
举一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。
最简单的防御方法是:“发现错误的时候并不立即返回,而是设一个标志位,直到完全比较完两个字符串再返回”。
时序攻击并非是一种理论攻击方法,OpenSSL、OpenSSH等应用都曾经有时序攻击漏洞

在进行数据校验(security credentials)时,避免任何信息泄露是最重要的。所以,我们要控制数据校验的执行时间。我们要保证,不管传过来的数据是什么,我们校验数据消耗的时间是相同的。如果你做不到这一点,程序对时序攻击的抵抗力很低。Node.js 使用 JavaScript V8 引擎, 为了高速运行网页而开发的,性能优异。V8引擎比较数据的方式是字节比较, 一旦发现有一个字节不一致, 比较运算就会停止。 因此,攻击者判断传入的 password 校验时间,核验时间越长说明 password 正确的部分越多。要修复这个问题, 可以使用 npm 模块 cryptiles。cryptiles.fixedTimeComparison()。

UDP / Datagram Sockets 数据报套接字模块 和 Net模块

在线文档
http://shouce.qdfuns.com/nodejs/dgram.html
http://shouce.qdfuns.com/nodejs/net.html
http://www.runoob.com/nodejs/nodejs-net-module.html

var socket = dgram.createSocket('udp4');创建的udp socket有close方法,没有destroy方法。
var socket = new net.Socket();创建的tcp socket没有close方法,有destroy方法。

cocos2d-x中node.getContentSize()的问题

在android真机中测试发现,如果没有setContentSize,调用Layer,Node的子类的getContentSize()值有可能是小于等于0的,这导致程序异常。

发表评论