【问题标题】:get user_id without rendering any route获取 user_id 而不渲染任何路由
【发布时间】:2016-11-04 12:09:30
【问题描述】:

如何在不向任何路由(端点)发出任何请求的情况下获取登录用户数据?

//how about I want to get logged in user's id here?

router.get('/',function(req,res,next){
  //usually we get data here
}

我知道我们可以使用req.user.id 或将用户的对象存储到res.locals.userId = req.user.id

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    您的服务器可以托管数以亿计的用户(它是多用户的)。因此,当您不在特定用户的特定请求中时,没有单个“当前”或“登录”用户。

    只有在处理请求时,您才代表特定用户执行某项操作,因此有特定用户与该请求相关联。

    根据您的登录方式,您可能拥有某种会话存储,其中包含所有当前登录的用户。当前登录的用户通常在请求中通过查看会话 cookie(针对该请求)然后在本地会话存储中查找该会话 cookie 以从会话存储中获取用户信息来确定。


    如果您想要用户信息的点在于建立 socket.io 连接,那么您可以在通过client.request.headers.cookie 建立 socket.io 连接时访问 cookie。使用 cookie,您应该能够获取您的登录会话,然后访问您想要的任何其他会话信息(与普通的 http 请求相同)。

    io.on('connection', function(client) {
        var cookie = client.request.headers.cookie;
        // using the cookie, you should then be able to get to your login session
        // using the session, you should be able to get to any other login data
    });
    

    要记住的一个概念是,socket.io 连接(基于 webSocket)的创建总是以正常的 HTTP 请求开始(然后协议升级为 webSocket 连接)。因此,当时所有正常的 HTTP 东西都是可用的(例如 cookie、标头等)。

    如果您尚未实现任何类型的用户身份验证(设置上述 cookie),那么您将需要在创建 socket.io 连接之前让用户进行身份验证(因此当您在上面访问时 cookie 就在那里) 或者您需要在 socket.io 连接过程中实现用户身份验证,这是通过 socket.io 中间件支持的。

    如果您在从护照访问 cookie 时遇到问题,请参阅:How to access Cookie set with Passport.js

    【讨论】:

    • 这个模块会有所帮助。 github.com/lmaccherone/node-localstorage 但是不做任何请求或中间件我怎么知道哪个用户登录了?
    • 实际上我需要用户的日期而不调用任何请求/中间件是我在任何这些请求/中间件之外初始化我的socket.io pastebin.com/mD48zqs1
    • @AliciaBrandon - 用户请求中的io.on('connection',...) IS(您应该提到这是您想要问题中信息的地方)。这是 socket.io 连接的开始。您可以在通过client.request.headers.cookie 连接套接字时访问当前连接的 cookie。通过 cookie,您应该能够访问会话存储中的任何登录信息。
    • 我收到了这个cookie: 'io=2OE3YFldQAChuWCwAAAA; connect.sid=s%3A_Hr1XDU31OEOqJ4bPkxkIacjEpk0cnFy.ZyJs608i7K3M%2FpkCUYPfYbp3q%2B6L1CDQoIEWS8dsim8; SQLiteManager_currentLangue=2; __atuvc=38%7C22%2C0%7C23%2C0%7C24%2C0%7C25%2C16%7C26' 我如何将它与我的登录用户联系起来?
    • @AliciaBrandon - 您的用户是否已通过身份验证并在您的 socket.io 服务器的域和端口上设置了身份验证 cookie?如果不是,则必须首先在 cookie 中有任何用户识别信息之前发生,这是一种了解谁在建立 socket.io 连接的安全方法。然后,您应该能够看到身份验证 cookie。或者,您也可以将身份验证直接添加到 socket.io 连接进程。无论哪种方式,您都需要一个身份验证过程才能知道谁在连接。
    【解决方案2】:

    您可以使用 express middleware 并在处理任何路由之前检查用户的 id,然后进行相应的重定向。

    【讨论】:

    • 在我看来,当没有活动请求时,OP 正在询问当前用户。中间件始终是请求的一部分,因此不适用。
    • 如果没有活动请求,我们怎么知道当前的用户对象呢?必须提出某种请求。
    猜你喜欢
    • 2019-01-20
    • 2016-05-29
    • 2018-02-02
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多