1. JavaScript / Говнокод #18226

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    // storage -> user -> project -> task -> attachments
    var userPath = path.join(basePath, userId);
    var projectPath = path.join(userPath, projectId);
    var taskPath = path.join(userPath, taskId);
    
    // happy mkdir... happy mkdir!
    try {
        try {
            fs.statSync(taskPath); // task folder exists
        }
        catch (err) {
            try {
                fs.statSync(projectPath); // project folder exists
            }
            catch (err) {
                try {
                    fs.statSync(userPath); // user folder exists
                }
                catch (err) {
                    fs.mkdirSync(userPath);
                }
                fs.mkdirSync(projectPath);
            }
            fs.mkdirSync(taskPath);
        }
    }
    catch (err) {
        return next(err);
    }

    Есть сервер на nodejs и программка типа менеджера задач. Надо было реализовать аттачменты к задачам. Есть папка storage, а в ней заводим папочки по иерархии, как в первом комментарии... и, видимо я что-то не понимаю в работе с файловой системой из под ноды :(

    Запостил: Alendorff, 22 Мая 2015

    Комментарии (15) RSS

    • С stat намудрили. Есть же exists:
      try { fs.statSync(xxx); } catch (err) if(!fs.existsSync(xxx))

      А вот с созданием папок действительно всё так печально.
      Но есть https://github.com/substack/node-mkdirp
      Ответить
      • Да, про existsSync я не досмотрел. Трайкетчить не надо. Но пишут, что будет deprecated скоро. А значит вот этот try-catch hell будет так же страшен, только на колбэках, а может ещё страшнее. А за mkdirp спасибо, я натыкался на него, но поленился к себе тянуть из-за единственного участка кода с файловой системой.
        Ответить
        • > пишут, что будет deprecated скоро
          Хм, и правда. Раньше такого не было...
          Выходит, если переносить их советы про open на mkdir, надо будет просто создавать папку и ловить исключение :(

          Хотели создать папку? Она уже создана, всё уже хорошо, поэтому надо бросить исключение, чтобы программист не расслаблялся.
          Ответить
          • > надо будет просто создавать папку и ловить исключение
            И это, имхо, правильно, чтобы на race condition не залететь.

            > Она уже создана, всё уже хорошо, поэтому надо бросить исключение
            А вот в этом случае исключения не должно быть: пытались создать папку, но она уже есть - ну и заебись. Исключение должно вылететь если там файл с таким же именем, прав нету, не существует родительская папка и т.п.

            Но это теория, на практике же нодовцы запросто могут обосраться и кинуть исключение, если папка уже существует.
            Ответить
            • > могут обосраться и кинуть исключение
              Так они и делают, окаянные (по крайней мере, в v0.10.32)
              Ответить
              • Ну хотя бы разные исключения кидают? По исключению можно понять, что папка уже была?
                Ответить
                • Да, есть код ошибки.
                  Error: EEXIST, file already exists.
                  Правда если существует не папка, а файл, то код тот же...
                  Ответить
                  • Ну тогда можно жить.

                    Вот только не вылетает ли то же самое исключение, если там не папка, а файл с таким именем?

                    Мда. Ну всё, приехали.
                    Ответить
                    • Вылетит-вылетит :)
                      Конечно, обычно файлы имеют расширение и тут конфликта с папкой не будет. Но если расширения нет, то не пройдет такой номер.
                      Ответить
    • >сервер на nodejs
      ССЗБ.
      Ответить

    Добавить комментарий