这让我发疯了......虽然我有一个Express + Socket.io的工作版本,我似乎无法通过在新项目文件夹中开箱即用的NPM安装来重现它。任何人都可以指出我错过了什么......?这是我的过程:
我在项目目录(node_modules
)中创建了一个pwd
文件夹,然后执行:
npm install express
npm install socket.io
运行这两个命令会将包按预期放入项目的node_modules
文件夹中。现在我使用以下内容设置我的服务器:
var express = require('express'),
server = express.createServer().use( express.static(__dirname+'./public') ).listen( 8080 ),
io = require('socket.io').listen(server);
我的public
文件夹包含我的应用程序的静态资源。我的公共索引HTML页面包含一个脚本标记:
<script src="/socket.io/socket.io.js"></script>
最后,我运行我的服务器脚本并在Web浏览器中转到该应用程序。我的静态公共文件都已正确提供,但我获得了/socket.io/socket.io.js
的404。现在,我可以从另一个旧项目交换express
包,让整个系统工作。不知何故,包实例配置不同,但我无法弄清楚如何重现它。 Express网站提到了有关安装依赖项的内容,尽管运行npm install -d
似乎没有帮助(运行pwd
时是否需要特定的npm install -d
?)。我想在使用NPM安装新的Express实例后,我必须遗漏一些重要的事情。
感谢您的所有见解!
答案 0 :(得分:6)
好的,所以我的例子实际上是我的代码的缩写,并且该示例代码确实有效。我遇到问题的真正代码更加混乱,如下所示:
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);
我通过执行以下操作修复了上述代码:
server = server.listen(8080);
显然,listen
命令包含服务器对象的一些附加功能。我最初发布的简写示例确实有效,因为listen
被链接到最终返回到服务器变量中。有趣的小细微差别。