我明白為什么這是一個錯誤,我嘗試了諸如 return 或 do function aysnc 之類的建議,但我無法解決它。
我的檔案只要 find.lenght 和 100 個子檔案。這就是為什么我使用兩個回圈。當第一次迭代完成并找到第二個匹配值時,服務器崩潰。沒有服務器它可以作業。
我有名為 0,1,2 的檔案,其中有 100 條從 0 到 100 的加密硬幣記錄。我添加了一張圖片。例如,USDT 在 [0,3]、[1,43]、[2,13],我想將這三個都發送。
app.post('/', (req, res) => {
print(req, res)
})
function print(req, res) {
MongoClient.connect(url, function (err, db) {
if (err) throw err;
var dbo = db.db("cryptoDb");
dbo.collection("coinTable").find({}).toArray(function (err, find) {
if (err) throw err;
for (i = 0; i < find.length; i ) {
let found = false;
for (j = 0; j < 100; j ) {
//console.log(i " " j)
let id = Capitalize(req.body.coinName);
if (find[i].result[j].name == id || find[i].result[j].symbol == id.toUpperCase()) {
// console.log(find[i].result[j]);
res.send(find[i].result[j]);
found = true;
}
}
if (!found) {
console.log("Not found")
}
}
db.close();
});
});
function Capitalize(s) {
return s[0].toUpperCase() s.slice(1).toLowerCase();
}
}
![將標頭發送到客戶端后無法設定標頭 [ERR_HTTP_HEADERS_SENT]](https://img.uj5u.com/2022/02/25/2c93bae838064547b3234cb33f003a2a.jpg)
太感謝了 !
uj5u.com熱心網友回復:
此錯誤來自于嘗試向同一個 http 請求發送多個回應。
您有res.send(find[i].result[j]);一個for回圈,并且在發送回應后您不會停止內部回圈。
因此,此代碼能夠嘗試向您無法執行的同一請求發送多個回應。
從代碼中不清楚所需的解決方案到底是什么。如果您只想發送第一個回應,那么您可以關閉資料庫并return在發送回應后終止兩個for回圈。
如果您打算發送多條資料,則將要發送的資料累積在一個陣列中,并在所有回圈完成后將所有資料發送一次。
如果您嘗試發送所有匹配結果的陣列,您可以這樣做:
app.post('/', (req, res) => {
print(req, res)
})
function print(req, res) {
MongoClient.connect(url, function(err, db) {
if (err) {
console.log(err);
res.sendStatus(500);
return;
}
var dbo = db.db("cryptoDb");
dbo.collection("coinTable").find({}).toArray(function(err, find) {
if (err) {
console.log(err);
res.sendStatus(500);
db.close();
return;
}
const id = Capitalize(req.body.coinName);
const idUpper = id.toUpperCase();
const results = [];
for (let findItem of find) {
for (let j = 0; j < 100; j ) {
if (findItem.result[j].name == id || findItem.result[j].symbol == idUpper) {
results.push(findItem.result[j]);
}
}
}
res.send(results);
if (!results.length) {
console.log("No results");
}
db.close();
});
});
function Capitalize(s) {
return s[0].toUpperCase() s.slice(1).toLowerCase();
}
}
其他注意事項:
我更改了
if (err) { ... }對資料庫呼叫的處理,以實際發送錯誤回應。通過您的請求處理程式的所有路徑都需要發送回應或導致發送回應。從 0 到 99 的硬編碼回圈有點奇怪,因為您不檢查
.result陣列中是否實際上有那么多條目。如果資料不完全符合您的預期,這可能會導致運行時錯誤。您沒有對
req.body您期望的資料進行任何驗證。在假設它是您所期望的之前,應該驗證來自用戶的所有資料。
uj5u.com熱心網友回復:
你有res.send你的 for 回圈,我假設你希望它在完成后退出,所以添加break到你的回圈中。
var senddata = [];
for (j = 0; j < 100; j ) { // <-- For loop, it will send multiple times
// console.log(i " " j)
let id = Capitalize(req.body.coinName);
if (find[i].result[j].name == id || find[i].result[j].symbol == id.toUpperCase()) {
// console.log(find[i].result[j]);
senddata[senddata.length] = find[i].result[j]); // Add to array
found = true;
}
if (!found) {
console.log("Not found")
}
}
res.send(JSON.stringify({senddata})); // Send unparsed data
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/432041.html
