【发布时间】:2013-06-30 07:43:36
【问题描述】:
我的问题是如何确保我的变量在页面被渲染之前被加载?我将 node.js 与 express 和everyauth 一起使用。
这是代码:
app.get('/', function(req, res) {
app.locals.rep = global.repos;
res.render('index');
});
当前,页面已加载,但包含变量的段落为空,并且出现错误:“无法读取未定义的属性 '...' [...]”。当我刷新页面时,内容就会流入。
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;
global.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 的第一天,所以请耐心等待。提前谢谢你。
【问题讨论】:
-
什么是
global.repos?显示它的定义位置。在启动前配置服务器时,您通常还会设置app.locals。 -
您也可以发表您的看法吗?
-
如果我是你,我会在整个 GitHub API 调用中添加一些日志记录,然后查看它是在向你的服务器发出第一个请求之前还是之后被调用的。这应该可以帮助您确定问题发生在哪里。报告您的发现,我会尽力提供进一步帮助 :) 您确定在服务器首次加载时调用了 load repos 函数吗?如果没有人登录?
-
GitHub API 请求仅在按下登录按钮时完成,如果那是您所要求的。 console.log() 证实了这一点。