2013-01-02 136 views
1

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

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

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

该脚本将收集来自网站的数据,然后通过socket.io连接到应用程序,但我似乎不能得到任何回应,因为该应用程序正在监听来自应用程序本身的index.html文件的请求,而不是来自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' } 
); 
}); 

然后该应用程式:

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

的tracker.js将使用后续连接看起来像这样:

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:[email protected]: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应用程序的见解吗?

回答

5

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

另一种解决方案是从你的tracker.js中的CDN加载socket.io(应该是http://cdn.socket.io/stable/socket.io.js)并删除你的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(我认为socket.io大约是100k压缩sed和跟踪解决方案相当大)

通常跟踪系统是通过创建请求并将变量作为参数发送完成的。

在客户端上:

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

在服务器上(托管GIF的1x1像素并将其命名为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"); 
}); 

希望这有助于一点。提示:我所有的代码都没有经过测试,但应该清楚我的意思。

+0

我敢肯定,socket.io方法将违反跨站点浏览器规则,这使得您的建议跟踪图像值得赞赏。 – mjhm

+0

不,socket.io可以跨域使用。在每个浏览器中(你可以在socket.io常见问题解答中看到它)。 – hereandnow78

+0

谢谢,我的立场是正确的。 – mjhm