结合套接字,并使用快递中间件时expression?

有没有办法让一个请求的套接字内的一个快递中间件?

即:

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!') }) 

这个想法是expression中间件有一个req.socket属性引用来自同一客户端的连接套接字。 这将允许一些更复杂的用例,例如:

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

客户端会有一个准确的进度条,他们只是通过API创build的图片。

这是一个连接socket.io和express的方法。 它使用快速会话为给定的客户端创build一个安全的会话对象。 然后,当一个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"}); });