2017-09-05 70 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

非常感謝,現在正在正常工作。感謝承諾以及:) –

相關問題