TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)

在上一篇TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(二)中,给大家介绍了Node.js的安装;本篇将介绍Node.js的使用,您将了解到:

1. Node.js的web框架:express
2. Node.js的实时通讯框架:Socket.IO
3. Node.js的redis客户端:redis

一. express
虽然用Node.js写一个Hello World很简单:
新建一server.js文件,内容如下:

1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)require('http').createServer(function (req, res) TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    res.writeHead(200TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){'Content-Type''text/plain'});
3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    res.end('Hello World\n');
4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}
).listen(8080"127.0.0.1");

然后打开命令行,进入server.js文件所在的目录,运行:node server.js,用浏览器打开http://localhost:8080/即能看到效果:

TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)


但稍微复杂的web应用就不能这么原始了,得借助于像express这样的Web Framework了。虽然express提供了Session等功能,还有其他基于express的认证框架passport等,但这里仅仅用express作为静态网页服务:
将如下内容写入server.js文件:

 1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//引入express模块,如果此处出错,请确认express已安装,
 2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//而且express在环境变量NODE_PATH目录中
 3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var express = require('express');
 4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//创建web服务
 5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var server = express.createServer();
 6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//以当前目录下的demo目录为web应用根目录
 7TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)server.use(express.static(__dirname + '/demo'));
 8TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//显示错误信息,以方便调试
 9TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)server.use(express.errorHandler(TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
10TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    showStack: true,
11TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    dumpExceptions: true
12TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}
));
13TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//启动express web服务,监听8080端口
14TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)server.listen(8080);

然后在server.js文件所在的目录创建demo目录,并创建demo.html文件,内容如下:

 1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<!DOCTYPE html>
 2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<html>
 3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<head>
 4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <title>Node.js Demo</title>
 5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)</head>
 6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<body>
 7TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <div>
 8TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        Hello Node.js!
 9TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    </div>
10TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)</body>
11TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)</html>

 

 然后重启Node.js服务,用浏览器打开http://localhost:8080/demo.html即能看到效果:

TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)




二. Socket.IO
Socket.IO提供了WebSockets服务,如果浏览器不支持HTML5标准的WebSocket,会用Flash代替,而且支持Json的自动解析和序列化,下面以提供TWaver HTML5拓扑数据为例,演示如何使用Socket.IO:
首先修改上面的server.js文件,加入如下内容,以创建WebSockets服务,并响应获取拓扑数据动作:
 1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//引入Socket.IO模块,如果此处出错,请确认Socket.IO已安装,
 2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//而且Socket.IO在环境变量NODE_PATH目录中
 3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var io = require('socket.io');
 4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//创建WebSockets服务
 5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var socket = io.listen(server, TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
 6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    log:false
 7TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}
);
 8TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//添加监听,相应前台请求
 9TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)socket.sockets.on('connection', function(client)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
10TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    //查询数据
11TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    client.on('getData', function () TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
12TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        //模拟数据
13TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        var result = TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
14TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            nodes: [
15TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
16TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    id: 'from',
17TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    name: 'From',
18TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    location: TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){ x: 100, y: 100 }
19TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                }
,
20TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
21TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    id: 'to',
22TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    name: 'To',
23TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    location: TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){ x: 200, y: 200 }
24TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                }

25TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            ],
26TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            links: [
27TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
28TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    id: 'from-to',
29TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    name: 'Hello TWaver HTML5',
30TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    from: 'from',
31TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    to: 'to'
32TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                }

33TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            ]
34TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        }
;
35TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        //返回数据
36TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        client.emit('getData', result);
37TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    }
);
38TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}
);

前台demo.html修改如***意不要漏掉引入Socket.IO js库,而且src地址必须为/socket.io/socket.io.js:

 1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<!DOCTYPE html>
 2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<html>
 3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<head>
 4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <title>Node.js Demo</title>
 5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <!--引用Socket.IO js库-->
 6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <script src="/socket.io/socket.io.js"></script>
 7TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <script src="./demo.js"></script>
 8TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)</head>
 9TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)<body onload="init()">
10TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    <div id="main">
11TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    </div>
12TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)</body>
13TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)</html>

 

再在demo目录添加demo.js文件,内容如下:
 1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//定义获取数据消息key
 2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var GET_DATA = 'getData';
 3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//WebSockets引用
 4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var socket;
 5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)
 6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)function init() TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
 7TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    //创建WebSockets
 8TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    socket = io.connect('http://localhost/'TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){ port: 8080 });
 9TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    //响应getData消息请求
10TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    socket.on(GET_DATA, onGetData);
11TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    //发送getData消息请求
12TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    socket.emit(GET_DATA);
13TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}

14TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)
15TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//getData消息处理方法
16TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)function onGetData(data) TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
17TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    console.log(data);
18TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    document.getElementById('main').innerHTML = JSON.stringify(data);
19TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}

最后重启Node.js,用浏览器重新打开http://localhost:8080/demo.html即能看到效果:

TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)



三. redis
redis是Node.js的Redis客户端,封装了Redis的指令,使用很简单,基本和Redis客户端命令一致。这里只用到了hashes,hashes相关的命令参见这里
开始之前,先切换到seraver.js文件所在的目录,启动redis服务(默认数据将保存在当前目录,文件名为dump.rdb

TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)


然后启动redis客户端,运行如下命令,加入测试数据:

hset datas from "{\"id\":\"from\",\"name\":\"From\",\"location\":{\"x\":100,\"y\":100}}"
hset datas to "{\"id\":\"to\",\"name\":\"To\",\"location\":{\"x\":200,\"y\":200}}"
hset datas from-to "{\"id\":\"from-to\",\"name\":\"Hello TWaver HTML5\",\"from\":\"from\",\"to\":\"to\"}"
save
exit

TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)



然后,修改后台server.js文件,加载redis模块,并创建redis客户连接:

1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//加载redis模块,创建redis客户端
2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)var redis = require('redis').createClient();
3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//打印redis出错信息
4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)redis.on('error', function (err) TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    console.log('Error ' + err);
6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}
);

再修改模拟数据部分,改为从数据库拿取数据,并将json格式的数据
 1TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)//添加监听,相应前台请求
 2TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)socket.sockets.on('connection', function(client)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
 3TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    //响应getData消息
 4TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    client.on('getData', function () TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
 5TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        //查询数据
 6TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        redis.hvals('datas', function(err, value)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
 7TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            if(value == null || value == '')TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
 8TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                client.emit('getData'null);
 9TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            }
elseTWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
10TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                //初始化返回结果
11TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                var result = TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){}, nodes = [], links = [];
12TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                result.nodes = nodes;
13TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                result.links = links;
14TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                //解析数据
15TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                for(var i=0,data,n=value.length; i<n; i++)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
16TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    //反序列化json对象
17TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    data = JSON.parse(value[i]);
18TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    //如果存在from属性,则为Link
19TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    if(data.from)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
20TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                        links.push(data);
21TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    }

22TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    //否则为Node
23TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    elseTWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三){
24TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                        nodes.push(data);
25TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                    }

26TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                }

27TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                //返回数据
28TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)                client.emit('getData', result);
29TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)            }

30TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)        }
);
31TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)    }
);
32TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)}
);
反序列化成js对象:

最后重启Node.js,用浏览器重新打开http://localhost:8080/demo.html即能看到和前面一样的效果。
至此一切准备工作完毕,下一篇将介绍如何使用TWaver HTML5展示这里生成的数据,本文代码见附件

转载于:https://www.cnblogs.com/twaver/archive/2011/12/31/2308877.html