1

我完全是 NodeJS 的菜鸟,我正在尝试了解应用程序结构。我有一个使用 Socket.IO 和 MongoJS 的基本应用程序,它本质上是一个跟踪系统,可以从客户端脚本中提取变量并将它们存储在 Mongo 中。

这是我想象的它的工作方式:

  • 用户在我们的 10 个站点中的 1 个上加载页面
  • 该页面上的 JS 文件捕获引用 URL 和时间戳
  • 然后通过 Socket.IO 将这 2 个值传递给 Node 应用程序
  • 然后应用程序连接到 MongoDB 并存储值

这似乎很简单,但这就是我的困惑所在。在所有文档和示例中,我已经看到与 socket.io 的连接是通过应用程序中的 HTML 页面进行的。就我而言,唯一的客户端文件是收集跟踪信息的单个 javascript 文件。

这是我想使用客户端 JS 的 socket.io 连接到服务器的方式:

$.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 集合,但是一旦我尝试从另一个站点访问它,我就会看到以下错误:

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

经过进一步研究,我的服务器配置似乎是错误的,因为我的应用正在加载 index.html 页面,但我不确定我的配置应该是什么。如果我想从外部 URL 加载客户端 JS,然后连接到我的服务器以将跟踪传递到我的应用程序,应该如何设置我的服务器?

4

1 回答 1

2

JS 文件只是代码容器,您应该考虑执行这些 JS 文件中的代码的运行时。您显示的此代码是从服务器下载并在浏览器上执行的客户端代码。因此,您不是在代码中“连接”到 socket.io,而是连接到服务器。

如果您连接到“document.location.href”,根据您的服务器端代码,您将再次获取此 js 文件。您需要连接到包含服务器端逻辑的正确服务器 url,例如http://socket.io/

请发布您的服务器端代码和详细的错误日志以获得更详细的解决方案。

于 2012-12-18T16:46:48.250 回答