Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 登录后在express部分中显示用户名_Javascript_Node.js_Handlebars.js_Passport.js_Express Handlebars - Fatal编程技术网

Javascript 登录后在express部分中显示用户名

Javascript 登录后在express部分中显示用户名,javascript,node.js,handlebars.js,passport.js,express-handlebars,Javascript,Node.js,Handlebars.js,Passport.js,Express Handlebars,所以,我一直在寻找一个解决方案,现在没有任何工作,我的问题 所以我有一个主页(“/”),一个配置文件页面(“/profile”)和一个登录/注册页面。我正在使用passport与本地、twitter和谷歌进行帐户访问。我想做的是在导航栏中显示用户名和个人资料图片,无论他们在网站上的任何位置 这是部分的外观: 分部/_nav.hbs {{#if isAuthenticated}} <div class="dropdown">

所以,我一直在寻找一个解决方案,现在没有任何工作,我的问题

所以我有一个主页(“/”),一个配置文件页面(“/profile”)和一个登录/注册页面。我正在使用passport与本地、twitter和谷歌进行帐户访问。我想做的是在导航栏中显示用户名和个人资料图片,无论他们在网站上的任何位置

这是部分的外观:

分部/_nav.hbs

{{#if isAuthenticated}}
             <div class="dropdown">
                <button type="button" class="btn btn-primary dropdown-toggle dropdown-button"
                 data-toggle="dropdown">
                 <img class="user-avatar" src="{{image}}" alt="{{username}}'s' avatar">{{username}}
                </button>
                    <div class="dropdown-menu">
                        <a class="dropdown-item user-dropdown" href="/profile">My Profile</a>
                        <a class="dropdown-item user-dropdown" href="#">User Settings</a>
                        <a class="dropdown-item user-dropdown" href="/logout">Logout</a>
                    </div>
                </div>
                {{else}}
                <a href="/register" class="account-button text-nowrap">Register/Login
                </a>
        {{/if}}
  module.exports = {
  ensureAuth: function (req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    res.redirect('/login');
  },
};
我已经尝试通过传递req.user对象,然后在我的partial中执行user.username来解决这个问题

我是个新手,但我认为问题可能是当我注销时,用户名不再存在,这就是为什么它会出现错误。但是如果是这种情况,它应该显示我的部分中的登录/注册按钮

请注意,我在我的server.js中注册了isAuthenticated作为一个局部变量,如果需要,这是我的ensureAuth代码:

中间件/auth.js

{{#if isAuthenticated}}
             <div class="dropdown">
                <button type="button" class="btn btn-primary dropdown-toggle dropdown-button"
                 data-toggle="dropdown">
                 <img class="user-avatar" src="{{image}}" alt="{{username}}'s' avatar">{{username}}
                </button>
                    <div class="dropdown-menu">
                        <a class="dropdown-item user-dropdown" href="/profile">My Profile</a>
                        <a class="dropdown-item user-dropdown" href="#">User Settings</a>
                        <a class="dropdown-item user-dropdown" href="/logout">Logout</a>
                    </div>
                </div>
                {{else}}
                <a href="/register" class="account-button text-nowrap">Register/Login
                </a>
        {{/if}}
  module.exports = {
  ensureAuth: function (req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    res.redirect('/login');
  },
};

所以我找到了解决办法。在我的回答中,我传递了req.user.username,但没有检查它是否确实存在。所以我在reddit上提问,有人帮我找到了这个答案:

const { user: { username, image } = {} } = req;
它的作用是分解用户对象,或者返回用户名和图像,或者什么都不返回({})

get请求如下所示:

router.get('/', (req, res) => {
  const { user: { username, image } = {} } = req;
  res.render('index', {
    username,
    image,
  });
});

你能提供用户注销的代码吗?我感谢你的帮助,但我已经解决了!我现在就把答案贴在这里。