async mkdir está lanzando errores existentes pero no está en nodo. js

Estoy tratando de crear un directorio en node.js e ignorar la excepción si el directorio ya existe.

Aquí está mi código:

const containerWorkDirectory = `/home/msh/Documents/arraba-api/app/build/plugin/images/images`;
const createDirectoryIfNotExists = async (
    dir,
    permission: boolean = true
) => {
    let output;

    try {
        output = await fsPromises.mkdir(dir, {
            mode: permission === true ? 0o775 : undefined,
        });
    } catch (error) {
        output = error.message;
        console.warn('Folder_Already_Exists');
    }

    return output;
};
const userDirectoryTreeCreation = async (userId) => {
    let userImagesDirectory = `${containerWorkDirectory}/${userId}`;
    let userProfileImagesDirectory = `${userImagesDirectory}/profile`;
    let userCarImagesDirectory = `${userImagesDirectory}/cars`;

    await createDirectoryIfNotExists(
        userImagesDirectory,
        true
    );
    await createDirectoryIfNotExists(
        userProfileImagesDirectory,
        true
    );
    await createDirectoryIfNotExists(
        userCarImagesDirectory,
        true
    );
};
userDirectoryTreeCreation(1);

Pero tengo este error:

{ [Error: EEXIST: file already exists, mkdir '/home/msh/Documents/arraba-api/app/build/plugin/images/images/5/profile']
  errno: -17,
  code: 'EEXIST',
  syscall: 'mkdir',
  path:
   '/home/msh/Documents/arraba-api/app/build/plugin/images/images/5/profile' }
{ [Error: EEXIST: file already exists, mkdir '/home/msh/Documents/arraba-api/app/build/plugin/images/images/5/cars']
  errno: -17,
  code: 'EEXIST',
  syscall: 'mkdir',
  path:
   '/home/msh/Documents/arraba-api/app/build/plugin/images/images/5/cars' }

Pero cuando comprobé la carpeta no existe. note que estoy usando Linux como os y carpeta no existen pero no tengo un error existente del sistema de archivos node.js.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por algorithmalchemist


2 Respuestas:

  • El problema que estás experimentando puede estar relacionado con el uso incorrecto de la función fsPromises.mkdir. En Node.js, cuando intentas crear un directorio que ya existe, la función fsPromises.mkdir generará un error del sistema de archivos. Para evitar que este error se propague como una excepción, puedes comprobar si el código de error es EEXIST y manejar la situación de forma que se ignore la excepción.

    Aquí te dejo una modificación en tu función createDirectoryIfNotExists para manejar correctamente el caso en el que el directorio ya existe:

    javascript const createDirectoryIfNotExists = async ( dir, permission = true ) => { try { await fsPromises.mkdir(dir, { mode: permission ? 0o775 : undefined, recursive: true // Esta opción evitará errores si la carpeta ya existe }); console.log(`Directorio creado: ${dir}`); } catch (error) { if (error.code === 'EEXIST') { console.warn('El directorio ya existe:', dir); } else { console.error('Error al crear el directorio:', error); } } };

    Al agregar la opción recursive: true, le estás indicando a fsPromises.mkdir que debe crear todos los directorios necesarios en caso de que alguno de ellos falte en la ruta especificada. Esto evitará que se genere un error EEXIST cuando intentes crear un directorio que ya existe.

    Espero que esta solución te sea de ayuda. Si tienes alguna otra pregunta, ¡estaré aquí para ayudarte!

    Respondida el Dec 20, 2020 a las 15:37 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error EEXISTS que estás experimentando en Node.js al intentar crear directorios con la función mkdir puede ocurrir cuando intentas crear un directorio que ya existe. Sin embargo, según mencionas, has verificado que los directorios no existen antes de intentar crearlos.

    Aquí hay algunas posibles razones por las que puedes estar obteniendo este error:

    Permisos: Asegúrate de que tienes los permisos adecuados para crear directorios en la ruta de destino. Rutas incorrectas: Verifica que las rutas que estás utilizando para crear los directorios sean correctas y no haya errores tipográficos. Carreras de condiciones: Es posible que haya una carrera de condiciones donde otro proceso o script intenta crear los directorios simultáneamente. Intenta usar fs.exists para verificar si el directorio existe antes de intentar crearlo. Módulo incorrecto: Asegúrate de que estás utilizando el método mkdir del paquete fs de Node.js, no un paquete de terceiros.

    Además, aquí hay algunas sugerencias para mejorar tu código:

    Usa fs.promises en lugar de devueltas de promesas: Esto simplificará tu código y eliminará la necesidad de envolver llamadas a funciones asíncronas en devueltas de promesas. Usa async/await para manejar operaciones asíncronas: Esto hará que tu código sea más fácil de leer y depurar.

    Aquí tienes un ejemplo de código actualizado que implementa estas sugerencias:

    ```js const { exists, promises: fsPromises } = require('fs');

    async function createDirectoryIfNotExists(dir, permission = true) { if (await exists(dir)) { console.log(Directory ${dir} already exists.); return; }

    await fsPromises.mkdir(dir, { mode: permission ? 0o775 : undefined}); console.log(Created directory ${dir}.); }

    async function createUserTree(userId) { const userDirectory = ${containerWorkDir}/${userId}; const userProfileDirectory = ${userDirectory}/profile; const userCarDirectory = ${userDirectory}/cars;

    await createDirectoryIfNotExists(userDirectory); await createDirectoryIfNotExists(userProfileDirectory); await createDirectoryIfNotExists(userCarDirectory); }

    createUserTree(1); ```

    Respondida el Dec 20, 2020 a las 15:38 - por Gemini

    Votos positivos: 0 | Votos negativos: 0