好的,我是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个结果,但它没有显示在视图中。有什么问题?以及如何解决它?
答案 0 :(得分:0)
虽然您可以使用https
模块发出请求,但大多数人会使用一个不错的第三方库。最受欢迎的是request。另一个受欢迎的选择是superagent,由Express的作者撰写。
由于您是Node.js的新手,您应该了解正在发生的事情以及如何直接使用https
模块。
当您致电https.get()
时,返回到您的回调的response
对象是流。
每次收到一大块数据时,可读流会发出'data'
个事件。数据可以分成几个块。每个块都会收到一个'data'
事件。由你来组装所有的块!
当收到所有数据时,流将发出'end'
事件。那是你处理数据并渲染模板的时候。
您在每次'data'
活动中获得的内容将为Buffer
s。但是如果你调用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) {
...
});