2

我的问题是如何确保我的变量在页面被渲染之前被加载?我将 node.js 与 express 和everyauth 一起使用。

这是代码:

app.get('/', function(req, res) {
   app.locals.rep = global.repos;
   res.render('index'); 
});

目前,页面已加载,但包含变量的段落为空,并且出现错误:“无法读取未定义的属性 '...' [...]”。当我刷新页面时,内容流入。

索引.jade

extends layout
block content
  h1= title
  - if (!everyauth.loggedIn)
    a(href="/auth/github") Login with github
  - else
    h3
      a(href='/logout') Logout
      h3 GitHub User Data
      - each r in rep
        p= r.name
        p= r.description

这是我设置 repos 变量的地方:

var 回购;
全局.repos = [];

everyauth.github
.appId(config.gh_clientId)
.appSecret(config.gh_secret)
.findOrCreateUser( 函数 (sess, accessToken, accessTokenExtra, ghUser) {

if (typeof usersByGhId[ghUser.id] === 'undefined') {

  usersByGhId[ghUser.id] = addUser('github', ghUser);

  var options = { 
            host: "api.github.com", 
            path: "/users/cmarius02/repos",
            method: "GET",
            headers: {
               "User-Agent": "github-connect" 
            }
  };

  var request= https.request(options, function(response){
    var body='';
    response.on("data", function(chunk){
      body+=chunk.toString("utf8");
    });

    response.on("end", function(){
      var json=JSON.parse(body);

      // console.log(json);  

      global.repos = [];
      for (var k in json)
        if ({}.hasOwnProperty.call(json, k)) {
          global.repos.push({
            name: json[k].name,
            description: json[k].description
          });
        }
    });
  });
  request.end();
  return usersByGhId[ghUser.id];

} else {
  return usersByGhId[ghUser.id];
}   })

.redirectPath('/');

这是我使用 node.js 的第一天,所以请耐心等待。先感谢您。

4

2 回答 2

1

我使用护照而不是everyauth,但我认为方法应该类似

Express 使用中间件链接代码,每个中间件负责调用下一个(即使他们不知道是哪个)

我做这样的事情:

    app.all ('*', function (req,res,next) {
      // Add the user from the session
      if req.user?
          res.locals.session_user = req.user
      // Add the flash messages
      res.locals.flash_messages = req.flash()

      next()
    });

    app.get('/', function(req, res) {
      res.render('index'); 
    });

app.all 表示该路由将匹配 get、put 和 post 请求。* 是匹配所有路由的正则表达式,因此第一个回调将在所有路由之前调用

req.user 由护照填写,我想everyauth 都有类似的东西。

res.locals 允许您将信息传递给视图。然后,在视图中,您可以将元素引用为 this.session_user (我不使用玉,但您明白了)。

另请注意,使用相同的方法,我将请求之间的闪烁传递给视图。

顺序很重要!并且 next() 向您保证,在前一个尚未解决之前,不会处理您的实际路线。如果需要,可以在该方法的另一个回调中调用 next。

于 2013-07-02T22:27:37.130 回答
0

通过使用 Express 中间件,您可以通过执行以下操作来覆盖渲染:

  app.use(function(req, res, next) {
    // Grap render
    var _render = res.render;

    // Override logic
    res.render = function(view, options, cb) {
      // Add logic (Example)
      if (!options.foo) {
        options.bar = true
      }

      // Original call
      _render.call(this, view, options, cb)
    }
    next()
  })
于 2016-04-01T18:53:16.717 回答