将客户端JS连接到服务器端的NodeJS应用程序

我是一个完整的NodeJS noob,我试图了解的应用程序结构。 我有一个使用Socket.IO和MongoJS的基本应用程序,它本质上是一个跟踪系统,从客户端脚本中提取variables并将它们存储在Mongo中。

以下是我想象的工作原理:

  • 用户在我们的10个站点中的1个上加载页面
  • 该页面上的JS文件捕获引用的URL和时间戳
  • 这两个值然后通过Socket.IO传递给Node应用程序
  • 该应用程序然后连接到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 <

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

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

如果你连接到“document.location.href”,根据你的服务器端代码,你只会得到这个js文件了。 您需要连接到包含服务器端逻辑的正确的服务器url,例如http://socket.io/

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