Javascript Express中的EJS变量引用显示为未定义
以下是一个示例,我在获取试图从API调用获取的数据以显示在浏览器中时遇到了一些困难:Javascript Express中的EJS变量引用显示为未定义,javascript,node.js,express,ejs,Javascript,Node.js,Express,Ejs,以下是一个示例,我在获取试图从API调用获取的数据以显示在浏览器中时遇到了一些困难: // An express route. app.get('/activities', function (req, res) { if (req.user !== null) { // User is authenticated. getUserActivities(req.user.id, res); } else { // Redirect to lo
// An express route.
app.get('/activities', function (req, res) {
if (req.user !== null) {
// User is authenticated.
getUserActivities(req.user.id, res);
} else {
// Redirect to login the user isn't authenticated.
res.redirect('/login');
}
});
// This function will make API calls to Fitbit
// using the User ID we got from the PassportJS
// authentication process.
function getUserActivities(id, res) {
// It will request from Fitbit User activities.
request('https://api.fitbit.com/1/user/'+ id +'/activities/',
function (error, response, body) {
if (!error && response.statusCode == 200) {
// If everything goes well.
return res.send(body);
} else {
// If something wrong happens.
return res.send(error);
}
}
);
}
我想使用EJS在网页上显示正文
,我已经这样尝试过:
。页面在浏览器中呈现,但变量显示为undefined
。我做错了什么?我想这只是一个语法问题,但我觉得好像我错过了一个步骤
编辑:我调用res.render()的代码
编辑2:index.ejs的相关部分
<body>
<% if (!user) { %>
<h2>Welcome! Please log in.</h2>
<% } else { %>
<!-- <h2>Hello, <%= user.displayName %>.</h2> -->
<div id="wrapper">
<div id="blank"></div>
<div id="content">
<div id="info">
Output: <%= this.body %>
</div>
</div>
</div>
<% } %>
</body>
欢迎请登录。
输出:
更新:问题仍然存在。我想放弃这个。这里肯定缺少一些东西,对吗?在渲染部分,只需发送一个对象,其中包含所有变量:
res.render('index', { user: req.user, body : body});
变量user
和body
将被发送到模板(非此.body
)
模板:
Output: <%= body %>
您需要“/activities”路由来使用索引视图,这次是一个主体变量,因此必须使用res.render
此外,您应该将body或error作为回调发送到函数,并执行如下操作:
app.get('/activities', function (req, res) {
if (req.user !== null) {
// User is authenticated.
getUserActivities(req.user.id,function(body){
res.render('index', { user: req.user, body : body}); //body will contain either body or err depending on what your function returned
});
} else {
res.redirect('/login');
}
});
function getUserActivities(id,callback) {
request('https://api.fitbit.com/1/user/'+ id +'/activities/',
function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(body);
} else {
callback(error);
}
}
);
}
分辨率渲染与分辨率发送的解释
res.send将原始变量转发到浏览器。如果需要通过视图,则需要使用res.render。因此,如果您试图通过AJAX调用查询/活动并在客户端处理原始结果,那么使用res.send就可以了。请参阅res.send之前的和console.log(body)文档,它有任何内容吗?它看起来不像是在
app.get(…)
下打印的任何内容。奇怪,对不起,我不明白你的意思。你能在getUserActivities函数(回调前)中运行console.log(body)吗?我的意思是当我打印一个文本字符串时,比如app.get('/activities',function(req,res){if(req.user!==null){//用户已通过身份验证。getUserActivities(req.user.id,function(body){console.log('body!!!'));它不显示任何内容。执行res.render('index',{user:req.user,body:body});
现在给出错误ReferenceError:body未在app.get.res.render.user中定义
哪个模板是您的
中?该模板是在前端渲染的还是您正在执行res.render()
在服务器端的某个地方?它在index.ejs
中,我已经在服务器上渲染过了。如果有帮助,我可以发布代码。好的,你在哪里调用res.render('index')
?听起来你需要用res.render('index',{body:body}之类的东西传递body
)
而不是res.send(body)
,后者只是将文本发送到浏览器,而不是通过模板。此外,您可能需要将this.body
更改为body
。您只能将一个变量对象传递给render()
。这意味着您应该使用:res.render('index',{user:req.user,body:body});
。之后,您只需确保在该路由之前在某些中间件中设置res.locals.body
,否则您应该在该路由中获取body
,不管您想怎么做。
app.get('/', function(req, res){
res.render('index', { user: req.user}); //no need for the body variable which doesn't exist yet
});
app.get('/activities', function (req, res) {
if (req.user !== null) {
// User is authenticated.
getUserActivities(req.user.id,function(body){
res.render('index', { user: req.user, body : body}); //body will contain either body or err depending on what your function returned
});
} else {
res.redirect('/login');
}
});
function getUserActivities(id,callback) {
request('https://api.fitbit.com/1/user/'+ id +'/activities/',
function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(body);
} else {
callback(error);
}
}
);
}