Ошибка записи файла с использованием «fs» в узле

Я пытаюсь записать в файл, используя следующую функцию:

function writeFile (data, callback) {
var fs = require('fs');
var now = new Date();

fs.writeFile(now.toISOString() + ".json", data, function(err) {

    if (err) {
        return console.log(err);
    } else {
        console.log(true);
    }
});
}

но получаю вот такую ​​ошибку:

{ Error: ENOENT: no such file or directory, open 'C:\Users\Ruslan\WebstormProjects\communication-system\client\6\28\2017_19:47:55.json'
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\Me\\WebstormProjects\\blah-blah\\client\\6\\28\\2017_19:47:55.json' }

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

РЕДАКТИРОВАТЬ: Это действительно было неправильное имя файла, которое мешало процессу сохранения.


person Community    schedule 29.06.2017    source источник
comment
подсказка: двоеточие является недопустимым символом для имен файлов в Windows   -  person ndugger    schedule 29.06.2017
comment
Проверьте символы в имени файла   -  person Pratik Gaikwad    schedule 29.06.2017
comment
Проблема в том, что вы пытаетесь создать путь к каталогу, который составляет имя с этим вызовом.   -  person Robert Moskal    schedule 29.06.2017


Ответы (1)


Когда вы вызываете fs.writeFile(), вы должны передать ему имя файла/путь:

  1. Где родительский каталог в пути уже существует.
  2. Где путь/имя файла содержит только символы, допустимые для вашей ОС.

Похоже, что вы, скорее всего, не выполните оба этих действия, если только вы заранее не создали каталог: C:\Users\Ruslan\WebstormProjects\communication-system\client\6\28. И если это работает в Windows, вы также не можете использовать : в имени файла.

Предположим, вы действительно хотите, чтобы путь был C:\Users\Ruslan\WebstormProjects\communication-system\client и какое имя файла должно быть основано на вашем now.toISOString(), обычный обходной путь - заменить разделители пути и другие недопустимые символы имени файла безопасными символами, чтобы вы преобразовали свой now.toISOString() во что-то, что всегда безопасно имя файла. В этом случае вы можете сделать это:

// replace forward and back slashes and colons with an underscore
// to make sure this is a legal OS filename
let filename = now.toISOString().replace(/[\/\\:]/g, "_") + ".json";

fs.writeFile(filename, ....)
person jfriend00    schedule 29.06.2017
comment
В регулярное выражение добавлен флаг g, так как он необходим для получения всех недопустимых символов. - person jfriend00; 29.06.2017