错误无法在发送后设置标头。 (res.send())

时间:2017-09-05 23:44:06

标签: javascript node.js express

我很容易犯错误,如果可能的话,我想帮忙。我需要从我的路由器发送一个数组:发音/路由:/单词到一个javaScript文件,该文件发送到该路由(" / words")一个包含像(ask)字样的数组。

所以在那条路线中(" / words")我正在向API请求单词(ask),然后我可以从数据库中获取它的所有值。

然后我将一个数组发送回文件,其中所有内容都由"返回res.send(数组)"。好的是可行的。但我的问题开始时,在该数组中有两个单词被发送到路由器/路由,即使请求运行良好,我能够从API中获取这些单词的信息(ask,a),当它运行该行"返回res.send(数组)"我有一条消息错误说"错误无法在发送后设置标头。"

这个解释是否足以让人理解?

提前致谢!

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

1 个答案:

答案 0 :(得分:0)

您希望等待所有请求完成,然后返回字典。 这可以使用(async)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));
});