Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

171
Visualizações
NodeJS Corriendo a través del archivo por steams

Estoy tratando de leer un archivo usando una secuencia. El archivo tiene un formato de archivo personalizado que tiene cierto número de secciones, cada una de 66 bytes. Tengo que verificar el valor de los primeros 32 bytes contra los 32 bytes dados y, si coinciden, devolver los 34 bytes restantes. Actualmente estoy haciendo lo siguiente

 const fs = require('fs') /** * @param {string} known */ function check(known) { let stream = fs.createReadStream('path/to/file', {highWaterMark: 66}); let out = ''; stream.on('data', (chunk) => { let temp = ''; for (let i = 0; i < 32; i++) { temp += String.fromCharCode(chunk.at(i)); } if (temp === known) { for (let i = 32; i < 66; i++) { out += String.fromCharCode(chunk.at(i)); } } }); return out; }

Sin embargo (al verificar con console.log ) sé que la función en stream.on se ejecuta después de que la check "finaliza", por lo que, independientemente de si se encuentra la cadena dada, el valor devuelto siempre será el mismo. ¿Cómo arreglar? Gracias por adelantado

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Los flujos no se bloquean y son asincrónicos. Llaman a sus controladores de eventos en algún momento en el futuro, después de que su función check() haya regresado. Así es como funcionan.

Como tal, no puede devolver directamente el resultado de la función porque la función devuelve antes de que se conozca el resultado. En su lugar, debe devolver el resultado mediante un mecanismo asíncrono, como un evento, una devolución de llamada o una promesa (preferiría una promesa en este caso). consulte Cómo devolver la respuesta de una llamada asíncrona para obtener más detalles sobre cómo devolver el valor recuperado de forma asíncrona.

Pero usar un flujo para leer un archivo que está estructurado en fragmentos de 66 bytes es la forma más difícil de escribir este código porque los bloques data tendrán un tamaño aleatorio y no se garantiza que se alineen con sus bloques de 66 bytes. Sería más sencillo usar const fileHandle = await fs.promises.open(...) y fileHandle.read(...) para leer un fragmento de 66 bytes desde el principio del archivo, verifique los 32 bytes que desea verificar y luego comunicar los 34 bytes restantes usando una promesa.

Aquí hay una forma de escribirlo usando handle.read() en su lugar:

 const fsp = require('fs').promises; async function check(known) { const kReadLen = 66; const kHeaderLen = 32; let handle = await fsp.open('path/to/file'); try { let buffer = Buffer.alloc(kReadLen, 0); let { bytesRead } = await handle.read(buffer, 0, kReadLen, 0); if (bytesRead !== readLen) { throw new Error("Insufficient data in the file"); } const headerStr = buffer.toString('utf8', 0, kHeaderLen); if (headerStr === known) { return buffer.toString('utf8', kHeaderLen, kReadLen); } else { return ""; } } finally { handle.close(); } }

Ejemplo de uso:

 check(testKnown).then(result => { console.log(result); }).catch(err => { console.log(err); })
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda