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.

Utilice la API de Slack (Bolt para JavaScript) para cargar una respuesta transmitida en tiempo real.

Estoy tratando de construir una aplicación que crea un archivo en un servidor y luego transmite el contenido de ese archivo al cliente.

Tengo código en el lado del cliente que se ve algo así:

app.event('apphomeopened', async ({ event, client, context }) => {
  try {
    const response: AxiosResponse<fs.readstream> = await axios({
      method: 'post',
      url: `${process.env.SOME_URL}/create`,
      data: {},
      headers: {},
      responseType: 'stream',
    });

app.client.files.upload({
  file: response.data,
  channels: event.channel,
});

} catch (e) {
    console.error(e);
  }
});

y en el servidor:

router.post(
  '/create',
  async (
    req: Request<any, any,="" any="">,
    res: Response<stream>,
    next: NextFunction
  ) => {
    try {
      const stream = fs.createReadStream('path/to/some/file.csv');

  stream
    .on('data', function (chunk: any) {
      console.log(chunk);
    })
    .on('end', function () {
      stream.pipe(res);
      next();
    })

    .on('close', function (err: any) {
      console.log('Stream ha sido cerrado');
    });
} catch (e) {
  next(e);
}
}

);

La solicitud POST devuelve este error:

(node:70966) UnhandledPromiseRejectionWarning: Error: Se produjo un error en la API: no_file_data

El Typescript se compila correctamente, así que no entiendo qué estoy haciendo mal. Cualquier ayuda sería muy apreciada.</any,></fs.readstream>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error es causado por el hecho de que no se está enviando ningún archivo de datos del servidor al cliente. En el código del servidor, el flujo de archivos se está transmitiendo directamente al flujo de respuesta, pero no se está enviando explícitamente ningún dato de respuesta de vuelta.

    Para solucionar este problema, puedes intentar modificar el código del servidor para leer los datos del archivo en un búfer y luego enviar explícitamente esos datos de vuelta en la respuesta. Aquí tienes un ejemplo de modificación del código del servidor:

    router.post(
      '/create',
      async (
        req: Request<any, any,="" any="">,
        res: Response<stream>,
        next: NextFunction
      ) => {
        try {
          const stream = fs.createReadStream('ruta/algun/archivo.csv');
          let data = Buffer.alloc(0);
    
          stream
            .on('data', function (chunk: any) {
              data = Buffer.concat([data, chunk]);
            })
            .on('end', function () {
              res.write(data);
              res.end();
              next();
            })
            .on('close', function (err: any) {
              console.log('El flujo se ha cerrado');
            });
        } catch (e) {
          next(e);
        }
      }
    );
    

    Esta modificación lee los datos del archivo en un búfer utilizando el evento data del flujo de archivos, concatenando cada fragmento de datos a medida que llega. Cuando el flujo termina, el búfer de datos se envía de vuelta en la respuesta utilizando el método write, y luego se finaliza la respuesta utilizando el método end.

    Con esta modificación, los datos del archivo deberían transmitirse correctamente desde el servidor al cliente y el error debería resolverse.</any,>

Comments are closed.