2013-01-03 25 views
3

我有一個由Node構建的跟蹤應用程序,該應用程序由我們網絡中的其他站點訪問。他們將訪問應用程序的直通HTML文件的頭,像這樣:NodeJS應用程序僅返回Socket.io歡迎信息

<title>Test</title> 
<meta name="generator" content="TextMate http://macromates.com/"> 
<script src="http://mynetwork.com:1337/tracker.js?pid=publisher1&ps=home"></script> 
</head> 
<body> 

的tracker.js文件使用socket.io連接到存儲在MongoDB的一些數據app.js。出於某種原因,當啓動socket.io然後加載引用該Tracker.js腳本的頁面時,我在第1行收到錯誤「未捕獲的SyntaxError:意外的標識符」,它實際上是「Welcome to socket.io。」消息,而不是javascript多數民衆贊成在文件中

這裏是Tracker.js樣子:

(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(); 
     } 
    }; 
    } 
    (document.getElementsByTagName('head') || document.getElementsByTagName('body'))[0].appendChild(io); 

}); 

(document, function(){ 
    var socket = io.connect('http://mynetwork.com:1337'); 
    socket.emit('adTracker', 
    { adServer: 'datalunk', adZone : 'top_home', referingURL : 'site.com' } 
); 

    socket.on('entrance', function(){ 
    console.log('Response is:' + data.message); 
    }); 
}); 

的app.js文件看起來像這樣:

var io = require('socket.io'); 
var tracker = io.listen(1337); 

tracker.configure(function() { 
    tracker.set('authorization', function (handshakeData, callback) { 
     if (handshakeData.xdomain) { 
      callback('Cross-domain connections are not allowed'); 
     } else { 
     callback(null, true); 
     } 
    }); 
}); 


tracker.sockets.on('connection', function (socket) { 
    socket.on('entrance', {message: 'connection has been made to app.js'}); 
    socket.on('adTracker', function (data) { 
    var adRequestData = data; 
var pass = ["bigbooks"]; 
var databaseUrl = "user:[email protected]:10006/node-test"; 
var collections = ["mads"] 
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"); 
}); 
    }); 
}); 

誰能告訴我爲什麼我會得到第1行的socket.io歡迎信息&錯誤,我該如何解決它?

回答

1
(function(document, onload){ 

    var io = document.createElement('script'); 
    // rest of code 
}); 

(document, function(){ 
// rest of code 
    }); 
}); 

應該

(function(document, onload){ 

    var io = document.createElement('script'); 
    // rest of code 
})(document, function(){ 
// rest of code 
    }); 
}); 

你使用,你應該調用一個匿名函數(和你不這樣做的話)。

正確的語法是(一個更簡單的例子):

(function(a) {console.log(a)})('Hello World'); 

但是你這樣做:

(function(a) {console.log(a)}); 
('Hello World'); 
+0

我修改了匿名函數,從Welcome返回Socket.IO消息。還有其他建議嗎? – HjalmarCarlson

+0

究竟在哪裏給錯誤?這行和哪個文件? –

+0

錯誤位於第1行。 從發佈商/第三方網站上的HTML文件調用tracker.js腳本時出現。 – HjalmarCarlson

0

確保服務器已安裝節點的最新穩定版本。根據官方網站,目前它是v0.8.16。

而且,如果socket.io服務器上運行http://mynetwork.com:1337/那麼我相信你應該能夠從http://mynetwork.com:1337/socket.io/socket.io.js

包括socket.io.js最快的方法來檢查,如果可能的節點版本的源問題是安裝Node Version Manager,然後v0.8.16,最後再次運行socket.io服務器

wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh 
nvm install v0.8.16 
nvm use 0.8.16 
node yourSocketIOserver.js