Если/Иначе, если блок не активируется с помощью модуля » fs » узла

#javascript #node.js #typescript #yargs

Вопрос:

Когда я пытаюсь запустить свое примерное приложение CLI (параметры, построенные с помощью yargs для анализа строк опций), оно выдает эту ошибку в трассировке стека fat: https://streamable.com/v4sih6 (видеозапись, поскольку она такая большая)

Я не знаю, что я делаю не так. Вот мой код ts:

 import type { Arguments, CommandBuilder } from 'yargs';
import chalk from 'chalk';
import * as logos from '../logos';
import fs from 'fs';

type Options = {
    componentName?: string;
};

export const command: string[] = ["component", "c", "comp"];
export const desc: string = 'Creates a component. Use: "vcli component title" - this makes a new title component (optional).';

export const builder: CommandBuilder<Options, Options> = (yargs) =>
    yargs
        .options({
            componentName: { type: 'string' },
        });

//TODO: Check if component exists

export const handler = (argv: Arguments<Options>): void => {
    const { componentName } = argv;
    if (componentName !== undefined) {
        const timerMsg: string = `${logos.prefix} Component with name '${componentName}' has been successfully created in`
        console.time(chalk.green(timerMsg));
        fs.mkdirSync(`./src/components/${componentName}`);
        fs.writeFileSync(`./src/components/${componentName}/index.tsx`, `import React from 'react';nnimport './${componentName}Styles.scss'`);
        console.timeEnd(chalk.green(timerMsg));
    } else if (fs.existsSync(`./src/components/${componentName}`)) {
        console.log(chalk.red(`${logos.prefix} Component ${componentName} already exists!`));
    } else {
        // Write an inquirer.js prompt here to ask for the name of the component :) 
    }
};
 

Спасибо за помощь.

Комментарии:

1. ты имеешь в виду, что это не произойдет, если? если (имя компонента !== не определено)

2. ну, ошибка в вашем видео показывает, что вы пытаетесь создать уже существующий каталог….

Ответ №1:

Если ваша проблема в том, что эта строка кода:

 fs.mkdirSync(`./src/components/${componentName}`);
 

выдает вам ошибку, потому что каталог уже существует, тогда вы можете просто поймать эту конкретную ошибку, проверить ее и проигнорировать, если это та конкретная ошибка, потому что на самом деле это не проблема, из-за которой вам нужно прервать.

 export const handler = (argv: Arguments<Options>): void => {
    const { componentName } = argv;
    if (componentName !== undefined) {
        const timerMsg: string = `${logos.prefix} Component with name '${componentName}' has been successfully created in`
        console.time(chalk.green(timerMsg));

        try {
            fs.mkdirSync(`./src/components/${componentName}`);
        } catch(e) {
            // only throw error if the error is not because the directory
            // already exists
            if (e.code !== 'EEXIST') {
                throw e;
            }
        }

        fs.writeFileSync(`./src/components/${componentName}/index.tsx`, `import React from 'react';nnimport './${componentName}Styles.scss'`);
        console.timeEnd(chalk.green(timerMsg));
    } else if (fs.existsSync(`./src/components/${componentName}`)) {
        console.log(chalk.red(`${logos.prefix} Component ${componentName} already exists!`));
    } else {
        // Write an inquirer.js prompt here to ask for the name of the component :) 
    }
};
 

Комментарии:

1. Спасибо, приятель! Очень помогло. Голосовали за.

Ответ №2:

Ошибка, которую вы получаете File already exists , связана с src/components/testing

Код, который терпит неудачу, является :

 fs.mkdirSync(`./src/components/${componentName}`);
 

Чинить

Проверьте if not exists перед записью, т. е. if (!fs.existsSync('./src/components/${componentName}')) должно быть до того, как вы попытаетесь сделать реж.

Комментарии:

1. Или просто поймайте эту ошибку и проверьте, не вызвана ли она тем, что она уже существует (а затем проигнорируйте ее).