企业应用中会有这样的需求,显示最新的xxx信息,如:销售信息、考核信息和公告信息等等。大的方向有两种模式:push和polling。因为刚学NodeJs,因此就用NodeJs简单的实现一下。
整个系统可以分为两部分:一、通信;二、最新消息获取。
通信部分可以采用:http://socket.io/。
最新消息获取部分为了支持一定的可扩展性,可以定义一个Provider接口,接口签名如下:
1、method:getFreshMessage(callback),示例:
1 provider.getFreshMessage(function (message) { 2 socket.emit('message', message); 3 });
2、event:message,示例:
1 provider.on('message', function (message) { 2 io.sockets.emit('message', message); 3 });
我们可以实现一个基于文件的Provider,思路是监听文件的变化。
FileProvider.js
1 var fs = require('fs'); 2 var events = require('events'); 3 4 var FileProvider = function (fileName, listener) { 5 var me = this; 6 7 me.fileName = fileName; 8 9 if (listener) { 10 me.on('message', listener); 11 } 12 13 fs.watchFile(me.fileName, function (curr, prev) { 14 me.getFreshMessage(function (message) { 15 me.emit('message', message); 16 }); 17 }); 18 }; 19 20 FileProvider.prototype = new events.EventEmitter(); 21 22 FileProvider.prototype.getFreshMessage = function (callback) { 23 var me = this; 24 25 fs.readFile(me.fileName, 'utf8', function (err, data) { 26 callback(data); 27 }); 28 }; 29 30 module.exports = FileProvider;
app.js
1 var io = require('socket.io').listen(8888); 2 var FileProvider = require('fresh.message').FileProvider; 3 var filePath = 'E:/node_study/socket_study/message.txt'; 4 5 var provider = new FileProvider(filePath); 6 7 provider.on('message', function (message) { 8 io.sockets.emit('message', message); 9 }); 10 11 io.sockets.on('connection', function (socket) { 12 provider.getFreshMessage(function (message) { 13 socket.emit('message', message); 14 }); 15 });
index.html
1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title></title> 6 </head> 7 <body> 8 <div></div> 9 </body> 10 </html> 11 <script src="socket.io/socket.io.js"></script> 12 <script> 13 var socket = io.connect('http://localhost:8888'); 14 socket.on('message', function (message) { 15 document.body.innerHTML = message; 16 }); 17 </script>
运行效果
NodeJs确实是一种值得玩味的平台,简单的学习就可以开发出强大的应用。