如何在Express.pars中使用app.get内的app.locals [英] how to use app.locals inside app.get in express and parse

查看:41
本文介绍了如何在Express.pars中使用app.get内的app.locals的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Express开发解析应用程序.我有一个索引文件,该文件显示登录用户和公共用户的相同信息,但登录公共用户和注销登录用户的信息除外.我正在使用app.locals来存储标志和登录的用户名,但是还有些不被保存的方式. 我的app.js代码是

I am working on a parse application using express. I have an index file which shows the same information to the logged in users and public users except a login to public users and logout to logged in users. I am using app.locals to store a flag and logged-in user name but some how they are not getting stored. My code for app.js is

// The homepage renders differently depending on whether user is logged in.
app.get('/', function(req, res) {
if(Parse.User.current()){

  Parse.User.current().fetch().then(function(user) {
     // Render the user profile information (e.g. email, phone, etc).
     name = user.get('username');
  });
  app.locals({flag :true,name:name});

}else{
  app.locals({flag:false, name:''});
}
// Render a public welcome page, with a link to the '/' endpoint.
  var ProfessionalUsers = Parse.Object.extend("User");
  var query = new Parse.Query(ProfessionalUsers);
  query.limit(50);
  query.equalTo("usertype", "Professional");
  query.find().then(function(profs) {
    res.render('index', {
      title: "Popular Experts",
      profs: profs,
    });
  });



});

我在索引中编写的代码

<div class='navigation'>
    <ul class='navigation-ul'>
        <li><a href='/' class='search' id='searchLink' >Search</a></li>
        <% if(flag){ %>
        <li><a href='/dashboard' class='dashboard' id='dashboardLink' >Dashboard</a></li>
        <% } %>
        <li><a href='/howitworks' class='how-it-works' id='howItWorksLink'>How it Works</a></li>
        <li><a href='/testimonials' class='testimonials' id='testimonialsLink' >Testimonials</a></li>
        <li><a href='/faqs' class='faqs' id='faqsLink'>FAQs</a></li>
        <% if(flag){ %>
        <li><a href='/logout' class='logout' id='logoutLink'>Logout<span class='username'>(<%= name ? name : '' %>)</span></a></li>
        <% }else{ %>
        <li><a href='/login' class='login-signup' id='navLoginSignupLink'>Login/Signup</a></li>
        <% } %>


    </ul>

</div>

显示专业人员的代码

<p><%= title %></p>
 <div class='professionals'>

 <% for(var i=0;i<profs.length;i++) { %>

<div class='professional'>

    <div class='picture-space' onclick = 'location.href = "/user/<%= profs[i].id %>"' style='cursor:pointer'>
      <img src='images/default.jpg'/>
    </div>
      <div class='name-space'><%= profs[i].attributes.username %></div>
      <div class='service-space'><%= profs[i].attributes.servicetype %></div>
      <div class='linkedin-space'><a href='http://<%= profs[i].attributes.linkedin %>' target='_blank'>Linkedin Profile</a></div>


</div>
<% } %>
</div>

这是我为解决此问题所做的

This is what I have done to fix this

// The homepage renders differently depending on whether user is logged in.
app.get('/', function(req, res) {

// Render a public welcome page, with a link to the '/' endpoint.
  var ProfessionalUsers = Parse.Object.extend("User");
  var query = new Parse.Query(ProfessionalUsers);
  query.limit(50);
  query.equalTo("usertype", "Professional");
  query.find().then(function(profs) {
    var user = Parse.User.current();
    if(user){
      user.fetch().then(function(user,error) {
        res.render('index',{user:user.toJSON(),profs:profs,title:'Popular Experts'});            
      });
    }else{
      res.render('index', {
      title: "Popular Experts",
      profs: profs,
      user:''
    });
    }


  });  

  });

推荐答案

app.locals无权访问req,res对象.它用于不随请求而变化的非动态数据(如应用程序名称或类似名称).我相信您所追求的是 res.locals (( http://expressjs .com/api.html#res.locals )

app.locals doesn't have access to the req, res objects. It is intended for non-dynamic data that doesn't change per request (like app-name, or something similar). I believe what you are after is res.locals (http://expressjs.com/api.html#res.locals)

我建议添加一些可以满足您需求的中间件.

I would suggest adding some middleware that does what you want.

您可以只为您的路线加载它.这将在执行您在该路由处定义的功能之前执行中间件RIGHT:

You could load it just for your route. This will execute the middleware RIGHT before it executes the function you defined at that route:

function getUserInfo(req, res, next) {
   var user_name = "adam"; //make some call here to get the user data

   //make 'user_name' variable available in the view
   res.locals.user_name = user_name;

   next(); //go to the next 'middleware', which is the stuff you defined.

}

//add getUserInfo here as middleware that will run on the '/' route BEFORE your middleware runs. Yours will be executed when 'next()' is called from the middleware function.
app.get('/', getUserInfo, function(req, res) {

这篇关于如何在Express.pars中使用app.get内的app.locals的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆