2017-09-05 80 views
-1

我正在与一个错误斗争,如果可能的话,我想要一个帮助。我需要从我的路由器发送一个数组:发送/路由:/单词到一个javaScript文件,发送到该路由(“/单词”)一个数组与像(问)。因此,在这条路径(“/ words”)中,我向API请求(ask),然后我可以从数据库中获取它的所有值。错误发送后无法设置标题。 (res.send())

然后我发送一个数组回到所有由“return res.send(array)”开始的文件。好的是工作。但是,我的问题是在数组中有两个单词发送到路由器/路由时开始的,即使请求运行良好,我可以从API获取这些单词的信息(请求,a),当它运行“return res.send(array)”行我有一条消息错误,指出“发送错误后无法设置标题”。

这个解释是否足够理解?

在此先感谢!

router.get("/words", function(req, res) { 
    var wordsToBeSearched = req.query.str; 
    var dictionary = []; 
    for(var i = 0; i < wordsToBeSearched.length; i++) { 
     var url = "http://www.dictionaryfake.com/api/xml/" + wordsToBeSearched[i]; 
     request(url, function(error, response, body) { 
      if(!error && response.statusCode == 200) { 
       parseString(body, function (err, result) { 
        var word = (JSON.stringify(result["entry_list"]["entry"][0]["ew"][0])); 
        var sound = (JSON.stringify(result["entry_list"]["entry"][0]["sound"][0]["wav"][0])); 
        var symbol = (JSON.stringify(result["entry_list"]["entry"][0]["pr"][0])); 
        var singleWord = {word: word.replace(/"/g,''), symbol: symbol.replace(/"/g,''), sound: sound.replace(/"/g,'')}; 
        dictionary.push(singleWord); 

        if(i === wordsToBeSearched.length) { 
         return res.send(dictionary); 
        }; 
       }; 
      }; 
     }; 
    }; 
}; 

enter image description here

+0

我们必须查看代码的相关部分以帮助您解决此错误。这种类型的错误通常在处理异步请求的方式上是错误的,但为了就您需要修复的问题提供建议,我们需要查看您的实际代码。由于您是新手,因此有关代码的***问题必须包含相关代码***。在回答具体问题时,我们大约比使用实际代码时要高出100倍,这比回答可能有数千个可能原因的理论问题要好。 – jfriend00

+0

您在评论中有一些有用的代码,但格式不正确。尝试编辑您的问题并将代码放在问题中。最基本的问题是你在'for'循环中调用'res.send',这意味着它不止一次被调用。 –

+0

然后,请使用您问题下方的“编辑”链接将代码添加到您的问题,然后正确格式化它。无论如何,注释中的多行代码通常是不可读的,代码应该在问题本身中。这里是关于堆栈溢出的[如何格式化代码](https://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)。 – jfriend00

回答

0

你要等待所有请求完成,然后再返回你的字典。 这可以使用(异步)promises很好地完成。您可以执行多个承诺,并等待所有这些承诺在res.send结果之前解决。

router.get("/words", function(req, res) { 
    var wordsToBeSearched = req.query.str; 
    var dictionary = []; 
    var requests = []; 

    for(var i = 0; i < wordsToBeSearched.length; i++) { 
    var req = new Promise((resolve, reject) => { 
     var url = "http://www.dictionaryfake.com/api/xml/" + wordsToBeSearched[i]; 

     request(url, function(error, response, body) { 
     if (error || !response.statusCode === 200) { 
      reject(error); 
     } else { 
      parseString(body, function (err, result) { 
      var word = (JSON.stringify(result["entry_list"]["entry"][0]["ew"][0])); 
      var sound = (JSON.stringify(result["entry_list"]["entry"][0]["sound"][0]["wav"][0])); 
      var symbol = (JSON.stringify(result["entry_list"]["entry"][0]["pr"][0])); 
      var singleWord = {word: word.replace(/"/g,''), symbol: symbol.replace(/"/g,''), sound: sound.replace(/"/g,'')}; 
      dictionary.push(singleWord); 
      resolve(); 
      }); 
     } 
     }); 
    }); 
    requests.push(req); 
    } 

    Promise.all(requests) 
    .then(() => { 
     res.send(dictionary); 
    }) 
    .catch(err => console.error(err)); 
}); 
+0

非常感谢,现在正在正常工作。感谢承诺以及:) –

相关问题