Javascript 回调返回空数组-Node.js
我找到了这些答案,但不知道如何实施:Javascript 回调返回空数组-Node.js,javascript,node.js,express,https,callback,Javascript,Node.js,Express,Https,Callback,我找到了这些答案,但不知道如何实施: 在app.post的代码底部有一个“回调”函数。 它应该返回在httpsYtGetFunc中创建的数组。 它返回带有null值的数组。数组的其余部分为空 app.js //为函数“httpsYtGetFunc”声明变量 让apiKey=“”; 设urlOfYtGetFunc=“”; 设resultOfYtGetFunc=“”; 设ExtractedResultofyGetFunc=[]; //此函数用于获取数据、解析数据、将所需值推送到数组中。
在
app.post
的代码底部有一个“回调”函数。
它应该返回在httpsYtGetFunc
中创建的数组。
它返回带有null
值的数组。数组的其余部分为空
app.js
//为函数“httpsYtGetFunc”声明变量
让apiKey=“”;
设urlOfYtGetFunc=“”;
设resultOfYtGetFunc=“”;
设ExtractedResultofyGetFunc=[];
//此函数用于获取数据、解析数据、将所需值推送到数组中。
函数httpsYtGetFunc(queryOfYtGetFunc,回调){
apiKey=“AI…MI”
urlOfYtGetFunc=”https://www.googleapis.com/youtube/v3/search?key=“+apiKey+”&part=snippet&q=“+queryOfYtGetFunc+”&maxResults=4&order=relevance&type=video”;
//获取数据并将其存储在块中。
https.get(urlOfYtGetFunc,(响应)=>{
常量块=[]
响应.on('数据',(d)=>{
块。推送(d)
})
//解析块
响应。在('end',()=>{
resultOfYtGetFunc=JSON.parse((Buffer.concat(chunks.toString()))
//console.log(resultOfYtGetFunc)
//提取有用的数据并进行分配。
对于(i=0;i<(resultOfYtGetFunc.items)。长度;i++){
ExtractedResultOfyGetFunc.push(ResultOfyGetFunc.items[i].id.videoId);
//log(extractedResultofyGetFunc);
}
})
})
回调(null,extractedResultofyGetFunc);
}
//客户提出POST请求。
应用程序post(“/”,功能(请求,回复){
query=“niall”;
//回调
ytQueryAppJs=httpsYtGetFunc(查询,(ytQueryAppJs)=>{
log(“ytQueryAppJs:”);
console.log(ytQueryAppJs);
});
});
控制台仅记录null
我相信回调(null,extractedResultofyGetFunc)
在https之前运行。get完成
有人能建议如何修复它并记录所有结果吗?
非常感谢你
这是原始问题的链接:
我不是Node.js开发人员,但我相信回调(null,extractedResultofyGetFunc);需要在http.get回调函数中调用 已编辑移动到
response.on('end')
回调
诸如此类:
function httpsYtGetFunc(queryOfYtGetFunc, callback) {
apiKey = "AI...MI"
urlOfYtGetFunc = "https://www.googleapis.com/youtube/v3/search?key=" + apiKey + "&part=snippet&q=" + queryOfYtGetFunc + "&maxResults=4&order=relevance&type=video";
// GETting data and storing it in chunks.
https.get(urlOfYtGetFunc, (response) => {
const chunks = []
response.on('data', (d) => {
chunks.push(d)
})
// Parsing the chunks
response.on('end', () => {
resultOfYtGetFunc = JSON.parse((Buffer.concat(chunks).toString()))
// console.log(resultOfYtGetFunc)
// Extracting useful data, and allocating it.
for (i = 0; i < (resultOfYtGetFunc.items).length; i++) {
extractedResultOfYtGetFunc.push(resultOfYtGetFunc.items[i].id.videoId);
// console.log(extractedResultOfYtGetFunc);
}
callback (null, extractedResultOfYtGetFunc);
})
})
}
函数httpsYtGetFunc(queryOfYtGetFunc,回调){
apiKey=“AI…MI”
urlOfYtGetFunc=”https://www.googleapis.com/youtube/v3/search?key=“+apiKey+”&part=snippet&q=“+queryOfYtGetFunc+”&maxResults=4&order=relevance&type=video”;
//获取数据并将其存储在块中。
https.get(urlOfYtGetFunc,(响应)=>{
常量块=[]
响应.on('数据',(d)=>{
块。推送(d)
})
//解析块
响应。在('end',()=>{
resultOfYtGetFunc=JSON.parse((Buffer.concat(chunks.toString()))
//console.log(resultOfYtGetFunc)
//提取有用的数据并进行分配。
对于(i=0;i<(resultOfYtGetFunc.items)。长度;i++){
ExtractedResultOfyGetFunc.push(ResultOfyGetFunc.items[i].id.videoId);
//log(extractedResultofyGetFunc);
}
回调(null,extractedResultofyGetFunc);
})
})
}
response.on('end',()
将函数与https.get
方法的“end”事件相关联。当调用回调(null,extractedResultOfYtGetFunc);
在https.get()
块之外时,https请求尚未完成,extractedResultOfYtGetFunc
数组为空
您需要将回调函数移动到response.on('end')
块
function httpsYtGetFunc(queryOfYtGetFunc, callback) {
apiKey = "AI...MI"
urlOfYtGetFunc = "https://www.googleapis.com/youtube/v3/search?key=" + apiKey + "&part=snippet&q=" + queryOfYtGetFunc + "&maxResults=4&order=relevance&type=video";
// GETting data and storing it in chunks.
https.get(urlOfYtGetFunc, (response) => {
const chunks = []
response.on('data', (d) => {
chunks.push(d)
})
// Parsing the chunks
response.on('end', () => {
resultOfYtGetFunc = JSON.parse((Buffer.concat(chunks).toString()))
// console.log(resultOfYtGetFunc)
// Extracting useful data, and allocating it.
for (i = 0; i < (resultOfYtGetFunc.items).length; i++) {
extractedResultOfYtGetFunc.push(resultOfYtGetFunc.items[i].id.videoId);
// console.log(extractedResultOfYtGetFunc);
}
callback (null, extractedResultOfYtGetFunc); // move the callback here
})
})
// callback (null, extractedResultOfYtGetFunc);
}
函数httpsYtGetFunc(queryOfYtGetFunc,回调){
apiKey=“AI…MI”
urlOfYtGetFunc=”https://www.googleapis.com/youtube/v3/search?key=“+apiKey+”&part=snippet&q=“+queryOfYtGetFunc+”&maxResults=4&order=relevance&type=video”;
//获取数据并将其存储在块中。
https.get(urlOfYtGetFunc,(响应)=>{
常量块=[]
响应.on('数据',(d)=>{
块。推送(d)
})
//解析块
响应。在('end',()=>{
resultOfYtGetFunc=JSON.parse((Buffer.concat(chunks.toString()))
//console.log(resultOfYtGetFunc)
//提取有用的数据并进行分配。
对于(i=0;i<(resultOfYtGetFunc.items)。长度;i++){
ExtractedResultOfyGetFunc.push(ResultOfyGetFunc.items[i].id.videoId);
//log(extractedResultofyGetFunc);
}
回调(null,extractedResultOfyGetFunc);//将回调移到此处
})
})
//回调(null,extractedResultofyGetFunc);
}
编辑 您需要在回调函数中再添加一个参数来接收错误(如果有)。
ytqueryyappjs=httpsYtGetFunc(query,(err,ytqueryyappjs)=>{
这能回答你的问题吗?@jornsharpe谢谢你查找。我已经尝试了“2.重新构造代码”的方法在上面的问题中,我分享了我在实现它时遇到的问题。是的,我尝试过做同样的事情。但它不起作用。然后尝试内部响应。on('end')…它似乎在响应的末尾被调用。accorriding to()“…上面的两个是response.on('data'),即当您获得数据和响应时。on('end'))这似乎解决了这个问题。我不知道为什么,但返回的结果是TypeError:Cannot set property'length'of undefined
。我检查了,并且API配额限制没有超过。(我无法验证这是否确实解决了这个问题。)非常感谢你,朋友。我有一些不必要的代码“未注释”,这是导致问题的原因。在旁注中,请你详细说明一下我们如何使用响应。关于('error')
?我读了文档,响应。关于('error')
是u