文章标签 » node.js

backup:展开文件路径中的通配符

python:

import glob
for input_file in glob.iglob(sys.argv[1]):
    for root, dirs, files in os.walk(input_file):
        for file in files:
            if file.endswith('.js') and not file.endswith('.min.js'):
                process_static_file(os.path.join(root, file))
            elif file.endswith('.css'):
                process_static_file(os.path.join(root, file))

php:

foreach (glob("*.txt") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

node.js:
https://github.com/isaacs/node-glob

var glob = require("glob")
 
// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
})

php & node.js & nginx-lua

做了个benchmark,了解下node.js和nginx-lua的能量,结果分享下。
报告:https://bluehua.org/demo/php.node.lua.html

结论:nginx-lua无论性能还是资源占用都很惊艳,node.js CPU耗的有点高

warning:请不要因为这个报告为您造成误导,每种语言都有它存在的价值和适用的场景:)

node.js中mysql-native的掉线重联

由于受一篇性能测试的文章的影响,选择了mysql-native作为node的mysql客户端,由于没有自动重联的功能,长时间运行后就会掉线,所以加了一段判断掉线的代码:

var Mysql = null;
 
function MysqlConnect() { //... }
 
MysqlSafeQuery = function(sql) {
    if (!Mysql || !Mysql.connection.writable) {
        MysqlConnect();
    }
 
    return Mysql.query(sql);
}

JsonStream.js

JsonStream.js是一个用于node.js的双向通信协议实现,它使用json作为数据包格式,可以用于socket,也可以用于http长连接,同时自带了简单的rpc实现。这段代码现在被用于一个对实时性要求比较高的小项目,本来打算用python+twisted做,但是后来临时决定尝试一下node.js,下面举例说明用法:

第一个例子,最简单的应用,基于socket通信,发送和接受json数据
StreamServer.js

var Net = require('net');
var JsonStream = require('./JsonStream.js');
 
//创建一个普通的socket server
var server = Net.createServer(function(c) {
    //当有客户端连接后,socket连接之上创建一个JsonStream
    var stream = new JsonStream.Stream(c);
 
    //监听客户端发来的json数据
    stream.on('json', function(json) {
        console.log('receiv json from client:');
        console.log(json);
    });
 
    //没三秒钟向客户端发送一个json数据
    setInterval(function(){
        stream.write({
            data:'hello client',
            time:new Date()
        });
    }, 3000);
});
 
server.listen(7777);

第二个例子,基于socket,两端互相rpc调用
RpcServer.js

var Net = require('net');
var JsonStream = require('./JsonStream.js');
 
//定义服务端支持的Rpc接口
var ServerApi = {
 
    //这是一个普通的接口,直接返回数据
    hello:function(name) {
        console.log('client call hello');
        return 'hello ' + name;
    },
 
    //这是一个异步返回的方法
    //这里的SimpleDeferred的确不是一个全功能的Deffered
    //只能用在异步返回的情况
 
    helloAfter:function(name, delay) {
        console.log('client call helloAfter');
        var defer = new JsonStream.SimpleDeferred();
        setTimeout(function(){
            defer.done('hello ' + name + ' after ' + delay + 's');
        }, delay * 1000);
        return defer;
    }
};
 
var server = Net.createServer(function(c) {
    var stream = new JsonStream.Stream(c);
    stream.delegate = ServerApi;
 
    //每3秒调用一次客户端的say方法
    setInterval(function(){
        stream.rpcCall('say', ['你好!']);
    }, 3000);
});
 
server.listen(7777);

RpcClient.js中的调用部分

stream.rpcCall('hello', ['client a'], function(res) {
     console.log(res);
});
 
stream.rpcCall('helloAfter', ['client a', 1], function(res) {
     console.log(res);
});

第三个例子,用于长连接的http双向通信,由于客户端的代码和现有的业务框架结合比较紧密,暂不提供,只示意一下Server端的代码,基本使用方法和socket的类似

var Http = require('http');
var JsonStream = require('./JsonStream.js');
 
//Rpc接口定义
var ServerApi = {
};
 
//创建一个http server
var HttpServer = Http.createServer(function(request, response){
    //让JsonStream处理所有http请求
    JsonStream.HttpStream.acceptRequest(request, response);
});
 
JsonStream.HttpStream.events.on('new', function(stream, request) {
    console.log('new http stream !!!!!');
    stream.delegate = ServerApi;
    //发送json到浏览器端
    stream.write({
        data:'hello browser'
    });
});
 
HttpServer.listen(80);
//长连接的最大时长设为30秒
JsonStream.HttpStream.checkTimeOut(30);

更多细节详见源码:),经过一段时间的运行,代码已趋于稳定,可以通过svn获取代码和示例,请容忍我的不爱写注释,呵呵~:

http://code-of-emptyhua.googlecode.com/svn/trunk/nodejs/jsonstream