0

コマンドで作成されたものとまったく同じ、必要最小限の高速アプリケーションがありexpressます。

次のように、socket.io をインストールしてサーバーに接続しました。

var app = express(),
    server = http.createServer(app),
    io = io.listen(server);

server.listen(8000);

さて、次のように呼び出されるルートファイルもあります。

app.get('/', routes.index);

このモジュール内には、次の関数があります。

exports.index = function(req, res){
  socket.emit('news', { message: "foo" });
};

これは明らかに500 参照エラーにつながります。これは、routes ファイルがエクスポート可能なモジュールであり、app.js ファイルにあるため、明らかにソケットが何であるかわからないためです。

このソケットオブジェクトまたは他のファイルからこのソケットオブジェクトにアクセスする方法はありますか? 高速生成されたアプリに添付されていることに注意してください。上記のプロジェクトへのリンクは次のとおりです。http://jsfiddle.net/E27yN


おまけ: セッションデータの取得/設定についてはどうですか?

前もって感謝します。

4

1 に答える 1

1

これを正しく読んでいると、非常によく似た問題が発生しました。 「require」を使用したNode.js非同期リターンの処理(ノードORM)

私がそれを解決した方法は、requireに関数呼び出しを置き、その関数をエクスポートで返すことでした。その後、そのローカル変数を介してアクセスできました。あなたの場合、私はそれがこのようなものになると思います:

var routes = require("routes.js")(io);
console.log(routes.index()); // will log return of the function "index" in routes.js.

// in routes.js
module.exports = function(io) {
  var exports = this;
  exports.index = function(req,res,io) {
    // now io.socket is available to routes
    console.log(io); 
  }
  return exports;
}

これで、その変数を使用して、エクスポートしたものにアクセスできます。したがって、セッションデータの取得と設定は、その情報を適切な場所との間で取得し、親ファイル(通常はapp.jsなどのノードで起動するものや何を持っているか)で変更することです。

お役に立てれば!

編集:コメントでこれについて議論した後、問題は、同じポートでexpressとsocket.ioを使用しようとしていることだと思います。

彼らがあなたのリンク(http://socket.io/#how-to-use)で示している例は、実際に彼らがapp.get( "/")からindex.htmlを提供していることを示しています。Index.htmlには、ソケットサーバーの起動時にデフォルトで提供されるsocket.ioスクリプトファイル()が含まれています。

これは次のようになります:http://jsfiddle.net/Lytpx/

エクスプレスを介してindex.htmlページを提供しますが、ソケットサービスは実際には/socket.io.jsを提供し、それがリスニングソケットサービスへの接続呼び出しを行うことに注意してください(io.connectでlocalhostを変更することもできます)。サーバーが何であれ、index.htmlを呼び出します)。

于 2012-12-07T16:38:03.380 に答える