我完全是 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,然后连接到我的服务器以将跟踪传递到我的应用程序,应该如何设置我的服务器?