2012-12-18 126 views
1

我是NodeJS的完全noob,我試圖瞭解應用程序結構。我有一個使用Socket.IO和MongoJS的基本應用程序,它本質上是一個跟蹤系統,它從客戶端腳本中提取變量並將它們存儲在Mongo中。將客戶端JS連接到服務器端NodeJS應用程序

這裏是我想象它會工作:

  • 用戶負載在我們的10個站點的1頁
  • 該網頁上
  • JS文件捕獲引用URL和時間戳
  • 那些2值然後被經由Socket.IO傳遞到節點應用
  • 該應用程序然後連接到MongoDB的並存儲的值

該S eems非常直接,但這裏是我的困惑所在。在所有的文檔和例子中,我看到了與socket.io的連接都是通過應用程序中的HTML頁面實現的。在我的情況下,唯一的客戶端文件是收集跟蹤信息的單個JavaScript文件。

這裏是我想連接到使用socket.io客戶端JS服務器:

$.getScript('/socket.io/socket.io.js', function(data){ 
    console.log(data); 
}); 

    var cmnPub = "Publishers.com" 
    var socket = io.connect(document.location.href); 
     socket.emit('adTracker', { 
      publisher: cmnPub, time : timeStamp, referingURL : document.location.href 
     }); 

這裏是我的服務器端代碼:

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs') 

app.listen(1337); 

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"); 
    }); 
    }); 
}); 

我知道上面的代碼將填充我的MongoDB集合,如果應用程序是本地的,但只要我嘗試從另一個站點訪問它,我會看到以下錯誤:

Uncaught SyntaxError: Unexpected token - myapp.js:1 <

經過深入研究,我的服務器配置出現錯誤,因爲我的應用正在加載index.html頁面,但我不確定我的配置應該是什麼。如果我想從外部URL加載客戶端JS,然後連接到我的服務器以將跟蹤傳遞到我的應用程序,應該如何設置我的服務器?

回答

2

JS文件只是代碼容器,您應該考慮在這些JS文件中的代碼執行的運行時。您顯示的這段代碼是從服務器下載並在瀏覽器上執行的客戶端代碼。所以,你不是在代碼中「連接」到socket.io,而是連接到服務器。

如果你連接到「document.location.href」,取決於你的服務器端代碼,你只需要重新獲得這個js文件。您需要連接到包含服務器端邏輯的正確服務器url,如http://socket.io/

請發佈您的服務器端代碼和詳細的錯誤日誌以獲取更詳細的解決方案。

+0

謝謝路易斯,我已經更新了我的問題,包括服務器端代碼。 – HjalmarCarlson