es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Retornando el valor del evento “finish” después de direccionar datos desde un flujo de lectura a un flujo de escritura.

Estoy tratando de crear un flujo de lectura y luego dirigir el contenido de un archivo XML de documento de Word a un flujo de escritura y luego leer desde ese flujo de escritura finalizado. El problema con el que me encuentro es que en la primera secuencia de lectura, escritura y lectura obtengo un error [Error: ENOENT: no existe el archivo o el directorio, abrir]. Sin embargo, después de que se haya creado este archivo en el primer intento, el código se ejecuta sin problemas y devuelve el valor de pageCount como se espera. He intentado leer desde el archivo completado y luego devolver el valor de pageCount dentro del evento ‘finish’, pero eso solo me deja con un valor devuelto indefinido. Por lo tanto, no estoy seguro de qué hacer.

Cualquier ayuda sería apreciada por este principiante que está luchando.

Actualización, el siguiente código funcionó para mí.

“`const unzipTheFile = async (data) => {
console.log("descomprimiendo");
const createWordOutput = new Promise((resolve, reject) => {
console.log("final se está ejecutando");
fs.createReadStream(data)
.pipe(unzipper.Parse())
.on("entry", async function (entry) {
const fileName = entry.path;
const type = entry.type;
const size = entry.vars.uncompressedSize;
//docProps tiene los metadatos del documento, word/document.xml es el documento real
if (fileName === "docProps/app.xml") {
// console.log(fileName);
entry.pipe(fs.createWriteStream("./wordOutput")).on("finish", () => {
console.log("terminó de escribir el archivo");
console.log("resolviendo");
return resolve();
});
//una vez que se completa el piping y se escribe completamente la estructura XML, se emite un evento 'finish'. Este evento acepta un callback. Aquí puse el cb y llamo a readTheFile en el archivo ./output. Esto lee con éxito los metadatos de cada archivo
} else {
entry.autodrain();
}
});
});
await createWordOutput;

const pageCount = await readWordFile("./wordOutput");
if (pageCount === undefined) {
console.log("PAGECOUNT ES INDEFINIDO");
}

console.log("registrando el número de páginas en descomprimir el archivo");
console.log(pageCount);
return pageCount;
};“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando está relacionado con las corrientes de lectura y escritura que no se ejecutan correctamente en sincronización. El mensaje de error que estás recibiendo sugiere que el archivo o directorio al que estás intentando acceder no existe, lo que indica que es posible que la corriente de escritura no haya terminado de escribir antes de que la corriente de lectura intente acceder a ella.

    Una opción que podrías intentar es usar promesas o async/await para asegurarte de que la corriente de escritura haya terminado antes de intentar leerla. En tu código actualizado, estás usando una promesa para manejar la creación del archivo de salida y luego esperas a que termine antes de llamar a la función readWordFile. Esta aproximación parece haber resuelto el problema que estabas enfrentando.

    Además, es posible que desees considerar el manejo de errores para los casos en los que la corriente de escritura no se complete o el archivo se corrompa o se vuelva inaccesible. También podrías explorar soluciones alternativas, como el uso de una biblioteca específicamente diseñada para trabajar con documentos de Word, ya que esto podría simplificar tu código y evitar dichos problemas por completo.

    En general, es importante asegurarse de que las operaciones de lectura y escritura se ejecuten en el orden correcto y que se manejen adecuadamente cualquier operaciones asíncronas para evitar errores y valores de retorno indefinidos. ¡Buena suerte!

Comments are closed.