NodeJS 在使用express中间件时,是否将合并socket和express结合起来?

p5fdfcr1  于 9个月前  发布在  Node.js
关注(0)|答案(2)|浏览(106)

有没有一种方法可以在express中间件中获取请求的套接字?
即:

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

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

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


客户端将有一个准确的进度条,显示他们刚刚请求通过API创建的图像。

5sxhfpxr

5sxhfpxr1#

这里有一种连接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"});
});

字符串

iqih9akk

iqih9akk2#

最后,可以使用socket版本4.6.0
这里基本的例子:

import session from "express-session";

io.engine.use(session({
  secret: "keyboard cat",
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));

字符串
官方Socket.io文档:https://socket.io/docs/v4/middlewares/#compatibility-with-express-middleware

相关问题