Express + socket.io:socket.io客户端脚本是404

big*_*mac 5 javascript node.js express socket.io

这让我很疯狂......虽然我有一个Express + Socket.io的工作版本,我似乎无法通过在新项目文件夹中开箱即用的NPM安装来重现它.任何人都可以指出我错过了什么......?这是我的过程:

node_modules在项目目录(pwd)中创建了一个文件夹,然后执行:

npm install express
npm install socket.io
Run Code Online (Sandbox Code Playgroud)

运行这两个命令会将包node_modules按预期放入项目的文件夹中.现在我使用以下内容设置我的服务器:

var express = require('express'),
    server = express.createServer().use( express.static(__dirname+'./public') ).listen( 8080 ),
    io = require('socket.io').listen(server);
Run Code Online (Sandbox Code Playgroud)

我的public文件夹包含我的应用程序的静态资产 我的公共索引HTML页面包含一个脚本标记:

<script src="/socket.io/socket.io.js"></script>
Run Code Online (Sandbox Code Playgroud)

最后,我运行我的服务器脚本并在Web浏览器中转到应用程序.我的静态公共文件都正常提供,但我得到了404 /socket.io/socket.io.js.现在,我可以express从另一个旧项目交换一个包,让整个系统工作.不知何故,包实例配置不同,但我无法弄清楚如何重现它.Express网站提到了有关安装依赖项的内容,虽然运行npm install -d似乎没有帮助(运行时是否pwd需要特定的npm install -d?).我想在使用NPM安装后,我必须遗漏一些关于配置新Express实例的重要信息.

感谢您的所有见解!

big*_*mac 7

好的,所以我的例子实际上是我的代码的缩写,并且该示例代码确实有效.我遇到问题的真正代码有点混乱,如下所示:

var server = express.createServer();

server
    .use( server.router )
    .use( express.static(__dirname+'/../public') )
    .get('/api', function(req, res) {
        res.write('API');
    });

server.listen(8080);

var io = require('socket.io').listen(server);
Run Code Online (Sandbox Code Playgroud)

我通过执行以下操作修复了上述代码:

server = server.listen(8080);
Run Code Online (Sandbox Code Playgroud)

显然,该listen命令包含一些附加功能的服务器对象.我最初发布的简写示例实际上是有效的,因为它listen被链接到最终返回到服务器变量中.有趣的小细微差别.