错误:
尝试访问http://localhost/appDirectory/socket.io
会给出:
Cannot GET /appDirectory/socket.io
或者换句话说,当试图在页面上加载客户端文件时,我会得到以下错误:
GET http://localhost/appDirectory/socket.io/socket.io.js 404 (Not Found)
如果我将客户端文件作为静态内容加载,则连接线将产生以下错误:
GET http://localhost/appDirectory/socket.io/1/?t=1365535131937 404 (Not Found)
服务器代码:
var express = require('express'),
namespace = require('express-namespace'),
routes = require('./routes'),
http = require('http'),
app = express(),
server = app.listen(process.env.PORT),
io = require('socket.io').listen(server);
var appDir = '/appDirectory';
app.configure(function(){
app.set('env', process.env.NODE_ENV || 'development');
app.set('/views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(app.router);
app.use(appDir, require('stylus').middleware(__dirname + '/public'));
app.use(appDir, express.static(path.join(__dirname, '/public')));
});
app.get(appDir + '/', routes.index);
io.sockets.on('connection', function (socket) {
socket.emit('message', 'lol');
});
客户代码:
<script src="/appDirectory/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect(appDir, { resource: appDir.substring(1) + '/socket.io' });
socket.on('connect', function () {
console.log('connected');
});
</script>
网络配置文件能让它正常工作的是。
Web.config:
<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" />
</handlers>
<iisnode loggingEnabled="true" debuggingEnabled="true" debuggerPathSegment="debug" />
<rewrite>
<rules>
<clear />
<rule name="Debug" patternSyntax="Wildcard" stopProcessing="true">
<match url="app.js/debug*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="None" />
</rule>
<rule name="app" patternSyntax="Wildcard">
<match url="*" negate="false" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="app.js" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
我的直觉是,快速路由干扰了socket.io路由,或者socket.io路由与虚拟目录不兼容。我确实看到socket.io提到了名称空间,我确实尝试了以下几点.
io.of(appDir).on('connection', function (socket) {
socket.emit('message', 'lol');
});
但这似乎没能解决问题。
我已经在客户端代码端尝试了许多不同的东西,但我不认为这是根本问题,否则http://localhost/appDirectory/socket.io/socket.io.js
就会起作用。
应用程序以虚拟目录的形式运行,并建立在以下基础上:
- node.js 0.10.3 for windows
- iis 7
- iisnode 0.2.4
- express.js 3.0.0rc1
- jade
- socket.io
模块"express命名空间“似乎使事情正常工作。
我知道iisnode是“设计”作为一个单独的站点运行的,我也知道express不喜欢在虚拟目录中运行,但我很确定这是可能的。
有趣的更新!
改变线路:
io = require('socket.io').listen(server);
至:
io = require('socket.io').listen(server, { resource: appDir + '/socket.io' });
导致iis工作进程w3wp.exe崩溃.
如图所示,http://i.imgur.com/65RGia3.png?1
然而,url http://localhost/appDirectory/socket.io
似乎起作用了。
试图修复此FYI的尝试失败:
可能的解决办法:
如果你在这个问题上犹豫不决,我发现这可能对你有帮助.
http://tomasz.janczuk.org/2013/01/hosting-socketio-websocket-apps-in-iis.html
发布于 2013-04-10 07:35:45
看来你走在正确的轨道上。使用以下配置,它适用于我(但不使用IIS ):
// server
io = require('socket.io').listen(server, { resource : '/appDirectory/socket.io' });
// client
<script src="/appDirectory/socket.io/socket.io.js"></script>
...
var socket = io.connect('', { resource: 'appDirectory/socket.io' });
我想知道您的IIS进程为什么会崩溃,您是否可以将图像发布到其他地方(Dropbox,免费图像占位器)?
发布于 2013-04-09 20:58:41
有点暗,但如果您使用的是Express 3.x,那么问题可能是您使用了早期的Express 2.x语法来连接Socket.io和Express。
有关新的集成方法,请参见:https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x#socketio-compatibility。
https://stackoverflow.com/questions/15911998
复制相似问题