2017-02-21 4 views
1

エクスプレスミドルウェアの内部にリクエストのソケットを取得する方法はありますか?エクスプレスミドルウェアの使用時にソケットを組み合わせて表現しますか?

すなわち:

import express from 'express'; 
import io from 'socket.io'; 

const app = express(); 

// combine app and io somehow ... 

// When client makes a GET request to '/emit/to/self', that client's socket will recieve the 'hello:world' message. 
app.get('/emit/to/self', (req, res) => { 
    req.socket.emit('hello:world', { ... }); 
    res.send('You just triggered your own socket!') 
}) 

アイデアは特急ミドルウェアが同じクライアントから接続されたソケットを参照するreq.socket性質を持っているということで。彼らは単にAPIを介して作成するために要求された画像の正確なプログレスバーを持っているでしょう

app.post('/image/create', (req, res) => { 
    createExpensiveImage({ 
    onProgress: (progress) => { req.socket.emit('image:progress', { progress }) }, 
    }); 
}) 

クライアント:これは、次のような、いくつかのより複雑なユースケースを可能にするであろう。

+0

はおそらく、この[socket.io間のセッションを共有し、表現する方法](http://stackoverflow.com/questions/25532692/how-to-share-sessions-with-socket- io-1-x-and-express-4-x)である。参考までに、Googleで「share session express socket.io」を検索すると、数百のヒットがあります。これについてたくさん書かれています。 – jfriend00

答えて

1

ここではsocket.ioとexpressを接続する方法があります。 express-sessionを使用して、特定のクライアントのセキュアセッションオブジェクトを作成します。次に、socket.io接続が発生すると、そのクライアントのセッションが取得され、socket.idがセッションに格納されます。

次に、エクスプレスルートハンドラ内のセッションからsocketIDを取得して、socket.ioを介してそのクライアントに送信できるようにします。または、socket.ioメッセージハンドラに入っているときに、そのユーザーからセッションデータを取得できます。どちらにでも行くことができます。ここでは基本的なコードです:

const express = require('express'); 
const app = express(); 
const server = app.listen(80); 
const io = require('socket.io')(server); 
const expsession = require('express-session'); 
const path = require('path'); 

// initialize session middleware 
const sessionMiddleware = expsession({ 
    secret: 'random secret', 
    saveUninitialized: true, 
    resave: true 
}); 

// hook up session for express routes 
app.use(sessionMiddleware); 

// hook up the session for socket.io connections 
io.use(function(socket, next) { 
    sessionMiddleware(socket.request, socket.request.res, next); 
}); 

// when a socket.io connect connects, get the session and store the id in it 
io.on('connection', function(socket) { 
    // socket.handshake.headers 
    console.log(`socket.io connected: ${socket.id}`); 
    // save socket.io socket in the session 
    console.log("session at socket.io connection:\n", socket.request.session); 
    socket.request.session.socketio = socket.id; 
    socket.request.session.save(); 
}); 

// general middleware to demo an increasing, per-client value in the session 
app.use(function(req, res, next) { 
    // req.session 
    const session = req.session; 
    if (!session.cntr) session.cntr = 0; 
    ++session.cntr; 
    next(); 
}); 

// route handler to serve up default page  
app.get("/", function(req, res) { 
    const session = req.session; 
    console.log("\n\npage load\n---------------------------\n"); 
    console.log("session:\n", session); 
    res.sendFile(path.join(__dirname, "socket-io-session.html")); 
}); 

let cntr = 1; 

// test route to show using socket.io .emit() from an express route 
app.get("/api/test", function(req, res) { 
    const session = req.session; 
    io.sockets.connected[session.socketio].emit('show', cntr++); 
    res.json({greeting: "hello"}); 
}); 
+0

ニース、ありがとう。私はエクスプレスとソケットの間でセッションの共有を見ていましたが、これをこのように使うことは考えていませんでした。後ろ向きには単純なようだ。 –

関連する問題