3

ネットワーク内の他のサイトからアクセスされるNodeで構築された追跡アプリがあります。次のように、HTMLファイルの先頭からアプリにアクセスします。

<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行目に「UncaughtSyntaxError:Unexpectedidentifier」というエラーが表示されます。これは実際には「Welcometosocket.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:pass@linus.mongohq.com: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ウェルカムメッセージとエラーが表示される理由と、それを解決するにはどうすればよいですか?

4

2 に答える 2

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');
于 2013-01-03T18:50:11.097 に答える
0

サーバーに最新の安定したバージョンのノードがインストールされていることを確認してください。公式サイトによると、現在は v0.8.16 です。

また、socket.io サーバーがhttp://mynetwork.com:1337/で実行されている場合、http://mynetwork.com: 1337/socket.io/ から socket.io.js を含めることができるはずです。 socket.io.js

Node バージョンが問題の原因であるかどうかを確認する最速の方法は、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
于 2013-01-03T18:52:29.860 に答える