node.js - socket.request.user 在 Passport.js、Socket.io 和 Express 中未定义

标签 node.js mongodb express sockets passport.js

我正在通过教程学习 NodeJs、Express 和 Socket.io,该教程使用以前版本的 NodeJs、Express 和 Socket.io 来访问 userID。我正在使用当前版本做同样的事情,但没有成功,我调整了我的代码以符合当前版本,但我得到的是一个空字符串。

session :

"use strict";
const session = require("express-session");
const MongoStore = require("connect-mongo")(session);
const config = require("../config");
const db = require("../db");

if (process.env.NODE_ENV === "production") {
  // Initialize session with settings for production
  module.exports = session({
    secret: config.sessionSecret,
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({
      mongooseConnection: db.Mongoose.connection,
    }),
  });
} else {
  module.exports = session({
    secret: config.sessionSecret,
    resave: false,
    saveUninitialized: true,
    store: new MongoStore({
      mongooseConnection: db.Mongoose.connection,
    }),
  });
}

服务器

"use strict";
const express = require("express");
const ChatCAT = require("./app");
const passport = require("passport");

const app = express();
app.set("port", process.env.PORT || 3000);
app.use(express.static("public"));
app.set("view engine", "ejs");

app.use(ChatCAT.session);
app.use(passport.initialize());
app.use(passport.session());
app.use("/", ChatCAT.router);

let port = app.get("port");
ChatCAT.ioServer(app, passport).listen(port, () => {
  console.log("ChatCAT Running on Port: ", port);
});

SOCKET.IO

 io.of("/chatter").on("connection", (socket) => {
    // Join a chatroom
    socket.on("join", (data) => {
      let usersList = helper.addUserToRoom(allrooms, data, socket);

      // Update the list of active users as shown on the chatroom page
      console.log("usersList: ", usersList);
      // console.log("sessionID: ", socket.request.session);
    });
  });

addUserToRoom 功能

let addUserToRoom = (allrooms, data, socket) => {
  // Get the room object
  let getRoom = findRoomById(allrooms, data.roomID);
  if (getRoom !== undefined) {
    // Get the active user's ID(ObjectID as used in session)
    // let userID = socket.request.session.passport.user;
    let userID = socket.request.user ? socket.request.user.id : "";

    //let userID = socket.request.session.passport.user;
    // Check to see if this user already exist in the chatroom
    let checkUser = getRoom.users.findIndex((element, index, array) => {
      // console.log("elementID: ", element.userID);
      if (element.userID === userID) {
        return true;
      } else {
        return false;
      }
    });

    // If the user is already present in the room, remove the user first
    if (checkUser > -1) {
      getRoom.users.splice(checkUser, 1);
    }

    // Push the user into the room's users array
    getRoom.users.push({
      socketID: socket.id,
      userID,
      user: data.user,
      userPic: data.userPic,
    });

    // Join the room channel
    socket.join(data.roomID);

    // Return the updated room object
    return getRoom;
  }
};

创建一个 IO 服务器实例

let ioServer = (app, passport) => {
  app.locals.chatrooms = [];
  const server = require("http").createServer(app);
  const io = require("socket.io")(server);
  const wrap = (middleware) => (socket, next) =>
    middleware(socket.request, {}, next);
  io.use(wrap(require("./session")));
  io.use(wrap(passport.initialize()));
  io.use(wrap(passport.session()));

  io.use((socket, next) => {
    if (socket.request.user) {
      next();
    } else {
      next(new Error("unauthorized"));
    }
  });

  require("./socket")(io, app);
  return server;
};

您可以在下图中看到我在 userID 中得到一个空字符串 enter image description here

更新

我调整了我的代码以使用 passport.socketio 但我的用户 ID 中仍然得到相同的空白字符串,当我将 socket.request 打印到控制台时,我得到了一些数据,但是当我打印 socket.request.user 时,我得到了 undefined :

let ioServer = (app, cookieParser) => {
  app.locals.chatrooms = [];
  const config = require("./config");
  const server = require("http").Server(app);
  const io = require("socket.io")(server);
  const passportSocketIo = require("passport.socketio");
  const sessionStore = require("./session");
  const helper = require("./helpers");

  io.use(
    passportSocketIo.authorize({
      cookieParser: cookieParser,
      key: "connect.sid",
      secret: config.sessionSecret,
      store: sessionStore.store,
      success: helper.onAuthorizeSuccess,
      fail: helper.onAuthorizeFail,
    })
  );

  const socket = require("./socket");
  socket(io, app);
  return server;
};

最佳答案

对于遇到此问题的任何人,如果使用 express > 4.0,则不需要使用 passportSocketIo,基于这篇文章 https://github.com/socketio/socket.io/blob/master/examples/passport-example/index.js#L76-L80//

您只需要这段代码,而不是使用 passportSocketIO。

const wrap = middleware => (socket, next) => middleware(socket.request, {}, next);
io.of(<your namespace>).use(wrap(sessionMiddleware)); //if using passport, it will be socket.request.session.passport.user
io.of(<your namespace>).use(wrap(passport.initialize()));
io.of(<your namespace>).use(wrap(passport.session())); // this sets it to socket.request.user

您的 userID 为空的主要原因是您正在使用 chatter 命名空间

io.of("/chatter")

并且不要像这样附加 session 中间件

io.of("/chatter").use(wrap(ChatCAT.session)); //if using passport, it will be socket.request.session.passport.user
io.of("/chatter").use(wrap(passport.initialize()));
io.of("/chatter").use(wrap(passport.session())); // this sets it to socket.request.user

关于node.js - socket.request.user 在 Passport.js、Socket.io 和 Express 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65059578/

相关文章:

node.js - 如何访问 basicAuth 内的快速路由

javascript - 使通过 Pug 传递的变量可用于 Javascript

node.js - Mongoose 查询 : compare two values on same document

node.js - 在开发者工具中隐藏文件?

javascript - Node.js + setInterval = 连接丢失 : The server closed the connection

javascript - 如何使用 sequelize 修复模型类的未定义问题?

Mongodb唯一稀疏索引

node.js - Mongoose 用条件填充子文档并更新它们

MongoDB java-driver插入日期

javascript - 在我的 Nodejs 项目中编辑产品时出现问题