Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 回调返回空数组-Node.js_Javascript_Node.js_Express_Https_Callback - Fatal编程技术网

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