如何在客户端JavaScript中访问Passport的req.user变量?

8

我在我的简单Express应用程序上设置了护照验证,并且它可以正常工作,我将其显示在我的索引页面上,例如:

<% if (!isAuthenticated) { %>
    <a id="signIn" href="/login">Sign In</a>
<% } else { %>
    <h3 id="welcomeMsg"><%=user.id%></h3>
    <h2 id="userBalance"><%=user.balance%></h2>
    <a href="/logout">Log Out</a>
<% } %>

在 index.js 文件中:
app.get('/', function(req, res){
  res.render('index', {
     isAuthenticated: req.isAuthenticated(),
     user: req.user
});

});

我想在我的公共目录中的客户端js文件中确认已登录用户的用户名。最简单和直接的方法是什么,使该变量在该文件中可用?

谢谢。


你现在的代码有什么问题吗?你只需要将其暴露给客户端JS,对吧?将其放入命名空间对象/模块等中。 - Dave Newton
你是说我需要从我的index.js中将它存储到对象中,然后它就可以在客户端js文件中使用了吗?我尝试过几种不同的方法,但它总是显示未定义,而且我不太明白为什么我可以在HTML中使用ejs轻松打印出来。 - user3473543
不,我的意思不是客户端和服务器是不同的进程。你需要呈现JS,然后从客户端访问它。个人而言,我更喜欢这种方式,而不是为获取已知数据而进行额外的http调用。 - Dave Newton
1个回答

14

由于passport.js使用cookie来维护会话,因此您可以在应用程序中添加一个简单的路由,以JSON格式提供当前已登录用户的数据:

app.get('/api/user_data', function(req, res) {

            if (req.user === undefined) {
                // The user is not logged in
                res.json({});
            } else {
                res.json({
                    username: req.user
                });
            }
        });

使用jQuery.getJSON()或任何其他能够GET请求JSON内容的方法,您可以使用客户端JavaScript访问它。

使用jQuery.getJSON()的示例:

$.getJSON("api/user_data", function(data) {
    // Make sure the data contains the username as expected before using it
    if (data.hasOwnProperty('username')) {
        console.log('Usrename: ' + data.username);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接