Apache 阿帕奇&x2B;Symfony2+;HTTPS+;Node.js+;Socket.io:Socket.emit未触发
我在这个问题上花了好几个小时,但是没有用 编辑:找到解决方案(参见我的答案) 项目背景 我正在Apache 阿帕奇&x2B;Symfony2+;HTTPS+;Node.js+;Socket.io:Socket.emit未触发,apache,node.js,symfony,https,socket.io,Apache,Node.js,Symfony,Https,Socket.io,我在这个问题上花了好几个小时,但是没有用 编辑:找到解决方案(参见我的答案) 项目背景 我正在Symfony2中构建一个项目,它需要一个上传大文件的模块。我选择了Node.js和Socket.IO(我必须从头开始学习,所以我可能缺少一些基本的东西)。 我将这些与HTML5文件和FileReader API结合起来,将文件分片从客户端发送到服务器。 初步测试表明,这种方法作为一个独立的应用程序非常有效,所有内容都由Node.js处理和服务,但与Apache和Symfony2的集成似乎存在问题 该应
Symfony2
中构建一个项目,它需要一个上传大文件的模块。我选择了Node.js
和Socket.IO
(我必须从头开始学习,所以我可能缺少一些基本的东西)。
我将这些与HTML5文件和FileReader API结合起来,将文件分片从客户端发送到服务器。
初步测试表明,这种方法作为一个独立的应用程序非常有效,所有内容都由Node.js
处理和服务,但与Apache
和Symfony2
的集成似乎存在问题
该应用程序有一个无担保和有担保的部分。我的目标是在端口80
和443
上使用Apache
,为大部分内置于Symfony2
的应用提供服务,并在端口8080
上使用Node.js
和Socket.io
上传文件。连接到套接字的客户端页面将由Apache
提供服务,但是套接字将通过Node.js
运行。上载模块必须在HTTPS上运行,因为页面位于具有经过身份验证的用户的安全环境中
问题是使用socket.emit
或socket.send
的事件似乎不起作用。客户机到服务器,或者服务器到客户机,都没有区别。没有发生任何事情,也没有错误
代码
显示的代码是我代码的简化版本,没有混乱和敏感数据
服务器
客户
//这是一个小树枝模板,所以我将提供一个摘录
{%block javascripts%}
{{parent()}}
var socket=io.connect(“my.server:8080”,
{
安全:是的,
端口:8080
});
//假设这是启动文件上传的函数
//文件是一个对象,包含有关文件的元数据,如文件名、大小等。
函数uploadNewFile(文件)
{
emit(“NewFile”,item);
}
{%endblock%}
所以问题是。。。
当然,应用程序的内容远不止这些,但这正是我被卡住的地方。页面完全加载,没有错误,但发出事件从不触发或到达服务器(断开连接事件除外)。我尝试在客户端和服务器上使用消息事件来检查是否只有自定义事件有问题,但这也不起作用。我猜有什么东西阻塞了客户机与服务器之间的通信(我已经检查过了,这不是防火墙)
我在这里完全不知所措,所以请帮忙
编辑:找到解决方案(请参阅我的答案)经过一些艰苦的调试,我发现了我的设置有什么问题。不妨分享我的发现,尽管它们(我认为)与Node.js、Socket.IO或Apache无关 正如我提到的,我的问题简化了代码,可以在没有混乱的情况下向您展示我的设置。然而,我是通过一个对象设置客户机的,使用属性来配置套接字连接。像这样:
var MyProject = {};
MyProject.Uploader =
{
location: 'my.server:8080',
socket: io.connect(location,
{
secure: true,
port: 8080,
query: "token=blabla"
}),
// ...lots of extra properties and methods
}
问题在于使用位置
作为属性名称。它在Javascript中是一个保留字,在这种情况下会导致一些奇怪的行为。我发现一个对象的属性名不能是保留字很奇怪,所以我决定进行测试。我还注意到我引用的属性不正确,当连接到套接字时,我忘记使用this.location
。所以我把它改成这个,作为一个测试
var MyProject = {};
MyProject.Uploader =
{
location: 'my.server:8080',
socket: io.connect(this.location,
{
secure: true,
port: 8080,
query: "token=blabla"
}),
// ...lots of extra properties and methods
}
但是没有用。我仍然无法通过套接字获取数据。因此,下一步在我的沮丧和愤怒中似乎是合乎逻辑的。更改属性名称修复了所有问题
var MyProject = {};
MyProject.Uploader =
{
socketLocation: 'my.server:8080',
socket: io.connect(this.socketLocation,
{
secure: true,
port: 8080,
query: "token=blabla"
}),
// ...lots of extra properties and methods
}
这种方法非常有效,我收到了大量调试消息。成功!!
如果您碰巧使用了保留字,Javascript中是否会出现重写对象属性的预期行为(或者这里发生的任何事情,“误用”感觉像是一种更好的方法,我不知道。我只知道从现在起我会避开他们
希望它能帮助任何人
var MyProject = {};
MyProject.Uploader =
{
location: 'my.server:8080',
socket: io.connect(this.location,
{
secure: true,
port: 8080,
query: "token=blabla"
}),
// ...lots of extra properties and methods
}
var MyProject = {};
MyProject.Uploader =
{
socketLocation: 'my.server:8080',
socket: io.connect(this.socketLocation,
{
secure: true,
port: 8080,
query: "token=blabla"
}),
// ...lots of extra properties and methods
}