无法从通过不同服务器或文件系统提供的html文件连接到socket.io.

时间:2015-11-12 18:34:29

标签: javascript html node.js socket.io

我正在尝试学习

大多数在线示例,包括official one要求在服务器端设置以下内容:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendfile('index.html');
});

io.on('connection', function(socket){
  console.log('a user connected');
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

这在客户端:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();
</script>

因此,它使用相同的服务器来提供index.html以及处理套接字连接,看起来socket.io目录下创建了一个socket.io js文件在服务器上。一切都很好。

现在,我正在开发应用程序,我现在不必从服务器提供index文件,因为它将与应用程序捆绑在一起。我只需要连接到特定端口上本地机器上运行的套接字服务器。

另外,我不想使用express,因为我正在学习 - 我认为只需设置一个套接字服务器就不需要它,我宁愿不使用它而不理解它的作用或它是如何使我的生活更轻松(换句话说,在跳进jquery的世界之前,我更喜欢关于javascript的一两件事...... )。

所以我在server.js文件中尝试了以下内容:

var port = 80;
io = require('socket.io')(port);
console.log('socket server started @ %s !', port);

通过node server.js命令执行此操作会打印socket server started @ 80 !

根据documentation应该创建一个http服务器(可能由socket.io增强,内容很棒),监听端口80

现在,如果我通过index.html括号IDE启动的node.js服务器加载http://127.0.0.1:56958/...path/index.html,其中包含以下内容:

<script src="scripts/libs/socket.io/socket.io.js"></script>
<script>
    console.log('test');
    var socket = io('http://127.0.0.1:80');
</script>

(其中scripts/libs/socket.io/socket.io.js是我从github repo下载的独立sockets.io客户端库 这让我在最新版本的chrome中出现以下错误:

Refused to execute inline script because it violates the following Content Security Policy directive: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'". Either the 'unsafe-inline' keyword, a hash ('sha256-2j6JUXRmZBJXdmMDTRd3ZxygBJNrb8gSbgOi4FOjiy0='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.

我还尝试使用index.html协议从文件系统加载file:///文件,这会引发相同的错误。

我做错了什么,我该如何解决这个问题?

注意:我看到this问题,但我没有cordova.xml文件,因为我还没有使用cordova构建应用程序。我尝试过启用跨源资源共享(使用商店扩展),但这也无济于事。

更新

以下是目录结构:

root
 |_app
 | | // lots of cordova directories and files like package.json
 | |_www
 |  |_scripts
 |  | |_libs
 |  |   |_socket.io
 |  |     |_socket.io.js
 |  |_index.html
 |_node_modules
 | |_socket.io
 |_server
   |_server.js

1 个答案:

答案 0 :(得分:2)

插件 cordova-plugin-whitelist 阻止了您的socket.io连接。您可以查看配置详细信息here。您需要仔细配置它,但出于测试目的,您可以允许所有内容:

<meta http-equiv="Content-Security-Policy" content="default-src *;">