【问题标题】:Incomplete variable in ExpressJs viewExpressJs 视图中的不完整变量
【发布时间】:2013-12-29 15:11:33
【问题描述】:

好的,我是 Nodejs 的新手,只是在玩它。我试图将一些简单的 python 代码转换为 js。我向 Youtube API 发送 get 请求,API 以 json 格式返回 50 个结果。 我的快递设置是全新的。使用 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 个结果,但它没有显示在视图中。有什么问题?以及如何解决?

【问题讨论】:

  • data 事件为每个块触发一次

标签: javascript node.js express ejs


【解决方案1】:

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

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

当您调用https.get() 时,返回给您的回调的response 对象是一个

每次接收到一大块数据时,可读流都会发出 'data' 事件。数据可能被分成几个块。您会为每个块获得一个 'data' 事件。将所有块组装在一起由您决定!

收到所有数据后,流将发出'end' 事件。那时您将处理数据并呈现您的模板。

您在每个'data' 事件中获得的块将是Buffers。但是,如果您调用 response.setEncoding('utf8'),则会导致块以字符串形式返回。

您需要在处理您的第一个'data' 事件之前致电response.setEncoding()。 (在您的代码中,第一个 '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) {
    ...
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2019-04-27
    • 2013-08-06
    • 1970-01-01
    • 2012-02-16
    • 2021-03-19
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多