2013-01-02 134 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