我是NodeJS的完整菜鸟,我正在尝试了解应用程序结构。我有一个使用Socket.IO和MongoJS的基本应用程序,它本质上是一个跟踪系统,它从客户端脚本中提取变量并将它们存储在Mongo中。
以下是我想象它会起作用的方式:
这看起来很直接,但这是我的困惑所在。在我看到的所有文档和示例中,与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然后连接到我的服务器以将跟踪传递到我的应用程序中,我应该如何设置我的服务器?
答案 0 :(得分:2)
JS文件只是代码容器,您应该考虑执行这些JS文件中的代码的运行时。您显示的代码是从服务器下载并在浏览器上执行的客户端代码。因此,您没有在代码中“连接”到socket.io,而是连接到服务器。
如果您连接到“document.location.href”,根据您的服务器端代码,您将再次获取此js文件。您需要连接到包含服务器端逻辑的正确服务器URL,如http://socket.io/上的示例
请发布您的服务器端代码和详细的错误日志以获取更详细的解决方案。