ExpressJs视图中的不完整变量

时间:2013-12-29 02:25:01

标签: javascript node.js express ejs

好的,我是Nodejs的新手,只是玩它。我试图将一些简单的python代码转换为js。我向Youtube API发送get请求的地方,API返回50结果为json格式。 我的快递设置是全新的。有ejs,手写笔和没有会话。 这是我的index.js代码

exports.index = function(req, res){
    var https = require("https");
    var url = "https://www.googleapis.com/youtube/v3/search?part=snippet&chart=mostPopular&key={API_KEU}&q=victorious&maxResults=50";
    https.get(url,function(response){
        response.on('data',function(d){
                response.setEncoding('utf8');
                console.log(d);
                res.render('index', { title: 'Express',data: d });
        });
    });
};

为了查看这是我的代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p> <%= data %> </p>
  </body>
</html>

问题是我的控制台打印出谷歌返回的所有50个结果,但它没有显示在视图中。有什么问题?以及如何解决它?

1 个答案:

答案 0 :(得分:0)

虽然您可以使用https模块发出请求,但大多数人会使用一个不错的第三方库。最受欢迎的是request。另一个受欢迎的选择是superagent,由Express的作者撰写。

由于您是Node.js的新手,您应该了解正在发生的事情以及如何直接使用https模块。

当您致电https.get()时,返回到您的回调的response对象是

每次收到一大块数据时,可读流会发出'data'个事件。数据可以分成几个块。每个块都会收到一个'data'事件。由你来组装所有的块!

当收到所有数据时,流将发出'end'事件。那是你处理数据并渲染模板的时候。

您在每次'data'活动中获得的内容将为Buffers。但是如果你调用response.setEncoding('utf8'),那么会导致块作为字符串返回。

您需要在处理第一个response.setEncoding()事件之前致电'data' 。 (在您的代码中,第一个'data'事件获得Buffer,然后您调用response.setEncoding(),并且任何其他数据事件都会获得字符串。)

以下是它的外观:

https.get(url, function(response) {
    // each time we get a chunk, we will append it to this var
    var data = '';

    response.setEncoding('utf8');

    response.on('data', function(chunk) { data += chunk; });

    response.on('end', function() {
        // when we get the 'end' event we know all the data has
        // been received
        console.log(data);
        res.render('index', { title: 'Express', data: data });
    });
}).on('error', function(err) {
  // any error handling goes here
  console.error(err);
});

这看起来像很多代码吗?这是使用request的相同处理程序。它更短:

request.get(url, function(err, resp, data) {
  if (err) { return console.error(err); }
  console.log(data);
  res.render('index', { title: 'Express', data: data });
});

而且,由于YouTube正在返回JSON数据,您甚至可以将request解析数据到JavaScript对象中。只需更改第一个参数,如下所示:

request.get({url: url, json: true}, function(err, resp, data) {
    ...
});