1

私はNodeJSの完全な初心者であり、アプリの構造を理解しようとしています。私はSocket.IOとMongoJSを使用する基本的なアプリを持っています。これは基本的に、クライアント側のスクリプトから変数を取得してMongoに保存する追跡システムです。

これが私がそれがうまくいくと想像した方法です:

  • ユーザーが10のサイトの1つにページをロードする
  • そのページのJSファイルは、参照URLとタイムスタンプをキャプチャします
  • これらの2つの値は、Socket.IOを介してノードアプリに渡されます。
  • 次に、アプリはMongoDBに接続し、値を保存します

これは非常に簡単に思えますが、ここに私の混乱があります。すべてのドキュメントと例で、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:password@linus.mongohq.com: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コレクションに入力されることはわかっていますが、別のサイトからアクセスしようとすると、次のエラーが表示されます。

キャッチされないSyntaxError:予期しないトークン-myapp.js:1 <

さらに調査したところ、アプリがindex.htmlページを読み込んでいるため、サーバーの構成が間違っているようですが、構成がどうあるべきかわかりません。外部URLからクライアント側のJSをロードし、サーバーに接続してトラッキングをアプリに渡す場合、サーバーをどのように設定する必要がありますか?

4

1 に答える 1

2

JS ファイルは単なるコード コンテナーです。これらの JS ファイル内のコードが実行されるランタイムについて考える必要があります。表示しているこのコードは、サーバーからダウンロードされ、ブラウザーで実行されるクライアント側のコードです。したがって、コードで socket.io に「接続」しているのではなく、サーバーに接続しています。

"document.location.href" に接続すると、サーバー側のコードによっては、この js ファイルが再び取得されます。http://socket.io/に例示されているように、サーバー側のロジックを含む正しいサーバー URL に接続する必要があります。

より詳細な解決策については、サーバー側のコードと詳細なエラー ログを投稿してください。

于 2012-12-18T16:46:48.250 に答える