Entendí por qué era un error, probé las sugerencias como return o do function aysnc, pero no pude solucionarlo.
Tengo documentos tan largos como find.lenght y 100 subdocumentos. Es por eso que uso dos bucles. Cuando se completa la primera iteración y se encuentra el segundo valor coincidente, el servidor se bloquea. Sin servidor funciona.
Tengo documentos llamados 0,1,2 y hay 100 registros de monedas criptográficas de 0 a 100 en ellos. Agregué una imagen. Por ejemplo, USDT está en [0,3], [1,43], [2,13] y quiero enviar los tres.
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(); } }Este error proviene de intentar enviar más de una respuesta a la misma solicitud http.
Tienes res.send(find[i].result[j]); dentro de un ciclo for y no detiene el ciclo interno después de enviar una respuesta.
Por lo tanto, este código es capaz de intentar enviar múltiples respuestas a la misma solicitud que no puede hacer.
No está claro en el código exactamente cuál es la solución deseada. Si solo desea enviar la primera respuesta, puede cerrar la base de datos y return después de enviar una respuesta que terminará ambos bucles for .
Si tiene la intención de enviar varios datos, acumule los datos que desea enviar en una matriz y envíe todos los datos una vez que se hayan realizado todos los bucles.
Si está intentando enviar una matriz de todos los resultados coincidentes, puede hacer esto:
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(); } }Otras notas:
Cambié el manejo de if (err) { ... } en su llamada a la base de datos para enviar una respuesta de error. Todas las rutas a través de su controlador de solicitudes deben enviar una respuesta o hacer que se envíe una respuesta.
El ciclo codificado de 0 a 99 es un poco extraño ya que no verifica si la matriz .result realmente tiene tantas entradas. Eso podría resultar en un error de tiempo de ejecución si los datos no son exactamente como los espera.
No tiene ninguna validación de los datos de req.body que está esperando. Todos los datos que llegan del usuario deben validarse antes de asumir que es lo que espera.
Tiene res.send dentro de su ciclo for, supongo que desea que se cierre una vez que haya terminado, así que agregue break a su ciclo.
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