Javascript Express中的EJS变量引用显示为未定义

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

以下是一个示例,我在获取试图从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 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);
            }
        }
    );
}