【问题标题】:Access is forbidden for Node.jsNode.js 禁止访问
【发布时间】:2013-09-25 21:13:57
【问题描述】:

我正在尝试使用 Node js 创建一个简单的聊天应用程序。我使用的是 Windows 操作系统。作为本地服务器,我使用 Xampp。我已经安装了节点。我还使用 package.json 安装了 socket.io。 package.json 中的代码如下。

{
    "name":"chat",
    "version":"0.0.1",
    "private":"true",
    "dependencies":{
        "socket.io":"0.9.16",
        "express":"3.4.0"
    }
}

然后我已经为服务器编写了代码。 Node 服务器在 1337 端口运行。服务器的代码如下。

var io = require('socket.io').listen(1337);

io.sockets.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
        console.log(data);
    });
});

然后当我运行它时,它正在运行。然后我在 index.php 文件中编写了客户端的代码。客户端代码如下。

<!DOCTYPE html>
<html>
<head>
    <title>Chat app.</title>
</head>
<body>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="/node:1337/socket.io/socket.io.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            var socket = io.connect('http: // localhost / node : 1337');
            socket.on('news', function (data) {
                console.log(data);
                socket.emit('my other event', { my: 'data' });
            });
        });
    </script>
</body>
</html>

但是当我尝试使用浏览器运行它时,我在控制台中看到的只是访问被禁止。我所有的文件,包括 node_modules 都保存在C:\xampp\htdocs\node

【问题讨论】:

    标签: node.js websocket socket.io chat


    【解决方案1】:

    您使用的代码是从 socket.io Home 页面复制的,它仅用作示例,但它实际上不是工作代码,因为 socket.io 脚本没有被绑定到任何服务器实例。

    Socket.io 不是服务器。它只是一个很好地处理 Websockets 的库。为了使用 socket.io,您必须要求 HTTP 或 Express 并创建一个服务器实例。然后你必须用 socket.io 绑定服务器实例。

    有关如何让 socket.io 启动并在您的服务器上运行的有效实现,您必须查看如何使用页面。他们有这些很好的代码示例,具体取决于您正在运行的实现(如果是 HTTP 或其他)。

    所以从头开始研究整个 Xampp 服务器的想法。 Node 有它自己的内置服务器功能,这就是您要使用的功能。

    这是一个工作示例(来自 socket.io 网站),说明 Socket.io 如何与 HTTP 一起使用。在这段代码 sn-p 中,还创建了服务器(它正在侦听端口 80),因此您不必担心:

    var app = require('http').createServer(handler)
      , io = require('socket.io').listen(app)
      , fs = require('fs')
    
    app.listen(80);
    
    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.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    

    服务器启动并运行后,您可以通过在浏览器中输入localhost:80 来访问它。

    【讨论】:

    • 我不希望节点为我提供索引页面。我希望节点只通过套接字交换 json 数据。那我该怎么办?