来自Express的EJSvariables引用显示为未定义

在用户Jobsamuel的很多帮助之后,我一直在尝试从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的网页上显示body ,我试过这样的: <%= this.body %> 。 该页面在浏览器中呈现,但variables显示为undefined 。 我在这里做错了什么? 我认为这只是一个语法问题,但我感觉好像我缺less一个步骤。

编辑:我打电话res.render()代码:

 app.get('/', function(req, res){ res.render('index', { user: req.user}, {body : body}); }); app.get('/account', ensureAuthenticated, function(req, res){ res.render('account', { user: req.user }); }); app.get('/login', function(req, res){ res.render('login', { user: req.user }); }); 

编辑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> 

更新:问题仍然存在。 我想放弃这个。 有什么东西不得不在这里丢失,对吧?

在渲染部分,您只需发送一个对象,其中包含所有variables:

 res.render('index', { user: req.user, body : body}); 

variablesuserbody将被发送到模板( 不是 this.body

模板:

 Output: <%= body %> 

所以在你的情况下,'/'路线需要改变为:

 app.get('/', function(req, res){ res.render('index', { user: req.user}); //no need for the body variable which doesn't exist yet }); 

而且你需要'/ activities'路由来使用索引视图,这次是一个bodyvariables,所以你必须使用res.render。

另外,你应该把body或者error作为callback函数发送到你的函数中,并且像下面这样做:

 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.render和res.send的解释

res.send会将原始variables转发到您的浏览器。 如果你需要通过视图,你需要使用res.render。 所以使用res.send会很好,如果你试图通过AJAX调用查询/活动,并处理客户端上的原始结果。 请参阅res.send和res.render的文档