node.js - Passport + Socket.io 获取登录用户 ID

标签 node.js mongodb socket.io passport.js

我正在制作一个 Node.js 应用程序,我需要在 socket.io 内的 mongoDB 中创建一个新文档。 我必须将登录的用户插入新文档中。

如何访问socketio内的 session 变量?

// INCLUDE MODULES =======================================================
var SocketIOFileUpload = require("socketio-file-upload");
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var socketio = require('socket.io');
var Twig = require('twig');
var twig = Twig.twig;
var path = require('path');
var mongoose = require('mongoose');
var passport = require('passport');
var Cookies = require( "cookies" );
var flash    = require('connect-flash');
var configDB = require('./config/database.js');
var connect = require('connect');

var ImageFile = require('./app/models/image');

// Assets ================================================================
app.use(express.static(path.join(__dirname, 'public')));
app.use(connect.favicon(path.join(__dirname, 'public/images/favicon.ico'))); 
// Start mongoose
mongoose.connect(configDB.url);

// USER MANAGEMENT =======================================================
require('./config/passport')(passport); // pass passport for configuration
app.use(connect.logger('dev')); // log every request to the console
app.use(connect.cookieParser()); // read cookies (needed for auth)
app.use(connect.json());       // to support JSON-encoded bodies
app.use(SocketIOFileUpload.router);         //socket io file upload
app.use(connect.urlencoded()); // to support URL-encoded bodies
app.set('view engine', 'twig'); // set up twig for templating
app.use(connect.session({ secret: 'ilovescotchscotchyscotchscotch' })); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(flash());

// Some more code ...

//SOCKET IO =======================================================
//Quand on client se connecte, on le note dans la console
var io = socketio.listen(server);
io.sockets.on("connection", function(socket){
        // Make an instance of SocketIOFileUpload and listen on this socket:
        var session = socket.handshake.session;
        var uploader = new SocketIOFileUpload();
        uploader.dir = "/LeafStore/public/uploads";
        uploader.listen(socket);
        console.log(socket.handshake.user);

        // Do something when a file is saved:
        uploader.on("saved", function(event, socket){
            console.log(event.file);
        });

     // Do something when a file is saved:
        uploader.on("complete", function(event){
            console.log("saving file" + name);
            console.log(event);
            var name = event.file.name;
            var imageData = {
                name: name
              , type: "image"
              , userId: ""
              , creationDate: new Date()
            };
            var newImage = new ImageFile(imageData);
            newImage.save( function(error, data){
                if(error){
                    throw error;
                }
                else{

                }
            });

            // save the user
            newImage.save(function(err) {
                if (err)
                    throw err;
            });;
        });

        // Error handler:
        uploader.on("error", function(event){
            console.log("Error from uploader", event);
        });
});


// LISTEN SERVER =======================================================
server.listen(80);

最佳答案

我找到了一个临时解决方案:

我在我的 View 中发出用户 ID:

socket.emit('userId', $("#userId").val());

然后我设置了 socket.userId var:

socket.on('userId', function(userId){
            socket.userId = userId;
        });

但这可能不安全

关于node.js - Passport + Socket.io 获取登录用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25633124/

相关文章:

javascript - 尝试将数组添加到 firebase 但遇到问题,因为 Nodejs 没有异步性质

node.js - MongoDB 连接字符串是否需要 ReplicaSet 中每个服务器的身份验证详细信息?

javascript - 每次建立新连接时,Socket.io 连接都会不断增加

node.js - 使用 passport.js 交换/转储 session 数据

Spring-Mongo : mapping mongo document field/s to BasicDBObject/Map of BasicDBObject of an Entity

mongodb - MongoDB 的默认数据库路径是什么?

php - 仅浏览器端的 Socket.io?

javascript - 如何在 mongoose 中使用具有用户 id 的帖子填充用户?

node.js - 如何正确关闭 socket.io/websocket-client?

javascript - 避免 Redis 持久化(Socket.io + Cluster + RedisStore)