1

私はsocket.ioとexpressで動作するサンプルクライアント接続を取得しようとしています(具体的には、これ: http://www.catonmat.net/blog/nodejs-modules-socketio/ httpsの他の例からのいくつかの部分) ://github.com/LearnBoost/socket.io/blob/master/examples/chat/app.js )。

ほとんどの部分をセットアップして動作させました。サーバーが実行され、/ を押して index.jade ファイルをブラウザーに取得できます。ただし、それが発生すると、何もしません。

サーバ:

var io = require('socket.io');
var express = require('express')
, stylus = require('stylus')
, nib = require('nib');

var app = express.createServer()
var io = io.listen(app);

app.configure(function () {
  app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }));
  app.use(express.static(__dirname + '/public'));
  app.set('views', __dirname);
  app.set('view engine', 'jade');

  function compile (str, path) {
    return stylus(str)
      .set('filename', path)
      .use(nib());
  };
});

app.get('/', function (req, res) {
  res.render('index', { layout: false });
});


app.listen(8080);

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

index.jade:

doctype 5
html
  head
    link(href='/stylesheets/style.css', rel='stylesheet')
    script(src='http://code.jquery.com/jquery-1.6.1.min.js')
    script(src='/socket.io/socket.io.js')
    script
      // socket.io specific code
      var socket = io.connect('http://localhost:8080');
      socket.on('connect', function () {
        alert('connected');
      });
      socket.on('news', function (data) {
          console.log(data);
          socket.emit('my other event', { my: 'data' });
        });
  body
    #chat

サーバーが /socket.io/socket.io.js を提供していないようです (http://localhost:8080/socket.io/socket.io.js でエラーが発生します)。そのファイルを提供するためにエクスプレスを取得するには、何をする必要がありますか? どの例でもそれを見つけることができません。

ここで私が間違っていることは他にありますか?

4

3 に答える 3

10

Express 3 でSocket.IO を使用http.Serverするには、インスタンス化して socket.io を次の場所に接続する必要があります。

var express = require('express')
  , http = require('http')
  , app = express()
  , server = http.createServer(app).listen(3000)
  , io = require('socket.io').listen(server)
  ;

これはうまくいくはずです。

于 2012-07-24T21:42:00.797 に答える
2

Express 3 を socket.io で使用するためのアップグレード ガイドの一部では、http.createServer を socket.io に渡すことを推奨しています。

これは機能しますが、socket.io クライアント ファイルを正しく提供していないようです。少しテストしたところ、app.listen から返されたものを socket.io に渡すと機能することがわかりました。

var express = require('express'),
    app = express(),
    server = app.listen(3000),
    io = require('socket.io').listen(server);

回答した一部の人々への注意:ファイル パスの問題ではありません。node + socket.io http サーバーを使用すると、 socket.io は「/socket.io/socket.io.js」への get 呼び出しを自動的にインターセプトし、クライアント ファイルを提供します。実際には、Web ファイル構造には存在しません。Express 3 を使用すると、この機能が壊れているように見えました。

于 2013-01-17T00:54:42.410 に答える
0

エラーは 404 であると想定しています。静的ファイルを提供するように ExpressJS を設定していません。をリクエスト/socket.io/socket.io.jsすると、ルートが検索されず、静的ファイルが提供されないため、404 が返されます。

通常は、public. その中にsocket.ioフォルダを配置し、その中にsocket.io.jsファイルを配置します。app.configure次に、これをブロックに追加します。

app.use(express.static(__dirname + '/public'));

これで ExpressJS は、リクエストが行われたときに JS ファイルを提供することを認識します。ExpressJS の静的構成の詳細については、こちらを参照してください。

更新:
私の間違い - 既に静的サーバーをセットアップしているようです。ディレクトリ パスは正しいですか。socket.ioフォルダはあなたのpublicフォルダにありますか?特定のエラーが表示されない場合、問題が何であるかを知ることは困難です。

于 2012-07-24T17:59:51.740 に答える