我很容易犯错误,如果可能的话,我想帮忙。我需要从我的路由器发送一个数组:发音/路由:/单词到一个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);
};
};
};
};
};
};
答案 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));
});