Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

170
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!