socket.io路由问题与node.js表示使用iisnode在虚拟目录中运行的3 app

时间:2013-04-09 20:36:20

标签: node.js express socket.io iisnode

错误:

尝试访问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  

模块“表达名称空间”似乎使事情有效。

我知道iisnode是“ Designed ”作为一个单独的站点运行,我也知道express不喜欢在虚拟目录中,但我很确定这个是可能的。

有趣的更新!

更改行:

io = require('socket.io').listen(server);

致:

io = require('socket.io').listen(server, { resource: appDir + '/socket.io' });

导致iis worker进程w3wp.exe崩溃...
如此处所见http://i.imgur.com/65RGia3.png?1

然而,网址http://localhost/appDirectory/socket.io似乎有效。

修复此FYI的尝试失败:

  • 为iisnode添加web.config设置nodeProcessCountPerApplication =“1”

可能的解决方案:

如果您正在处理同样的问题,我发现这可能会对您有所帮助...
http://tomasz.janczuk.org/2013/01/hosting-socketio-websocket-apps-in-iis.html

2 个答案:

答案 0 :(得分:1)

在黑暗中有点刺,但如果您使用的是Express 3.x,那么您的问题可能是您使用较旧的Express 2.x语法来连接Socket.io用Express。

有关新的集成方法,请参阅:https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x#socketio-compatibility

答案 1 :(得分:1)

看起来你走在正确的轨道上。使用以下配置,它适用于我(不使用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,免费图片托管商)吗?