Можно ли записывать данные в файл, используя только JavaScript?

Я хочу записывать данные в существующий файл с помощью JavaScript. Я не хочу печатать их на консоли. Я хочу фактически записывать данные в abc.txt . Я читал много ответил на вопрос, но везде, где они печатают на консоли. в каком-то месте они дали код, но он не работает. Так что, пожалуйста, кто-нибудь может мне помочь Как на самом деле записывать данные в файл.

Я сослался на код, но он не работает: ошибка выдачи:

Uncaught TypeError: недопустимый конструктор

на хроме и

SecurityError: операция небезопасна.

в Mozilla

  var f = "sometextfile  .txt "; writeTextFile (f," Spoon ") writeTextFile (f," Cheese monkey ") writeTextFile (f," Onion ") function writeTextFile (имя файла, вывод) {var txtFile = new File (имя файла);  txtFile.writeln (вывод);  txtFile.close ();}  

Так можем ли мы действительно записывать данные в файл, используя только Javascript или НЕ?


Некоторые предложения для этого —

  1. Если вы пытаетесь записать файл на клиентском компьютере, вы не можете сделать это каким-либо кроссбраузерным способом. В IE есть методы, позволяющие «доверенным» приложениям использовать объекты ActiveX для чтения/записи файла.
  2. Если вы пытаетесь сохранить его на своем сервере, просто передайте текстовые данные на ваш сервер и выполнить код записи файла, используя некоторый язык на стороне сервера.
  3. Для хранения некоторой информации на стороне клиента, которая значительно меньше, вы можете использовать файлы cookie.
  4. HTML5 API для локального хранилища.

228

Вы можете создавать файлы в браузере, используя Blob и URL.createObjectURL . Все современные браузеры поддерживают это.

Вы не можете напрямую сохранить созданный файл, так как это может вызвать серьезные проблемы с безопасностью, но вы можете предоставить его как ссылку для загрузки для пользователя. Вы можете предложить имя файла с помощью атрибута download ссылки в браузерах, которые поддерживают атрибут загрузки. Как и при любой другой загрузке, последнее слово по поводу имени файла будет за пользователем, загружающим файл.

  var textFile = null, makeTextFile = function (text) {var data  = новый Blob ([текст], {тип: 'текст/простой'}); //Если мы заменяем ранее сгенерированный файл, нам нужно//вручную отозвать URL объекта, чтобы избежать утечки памяти.  если (textFile! == null) {window.URL.revokeObjectURL (textFile);  } textFile = window.URL.createObjectURL (данные); //возвращает URL-адрес, который можно использовать как href return textFile;  };  

Вот пример, в котором этот метод используется для сохранения произвольного текста из textarea .

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

  var create = document.getElementById ('create'), textbox = document.getElementById ('textbox');  create.addEventListener ('клик', функция () {var link = document.createElement ('a'); link.setAttribute ('загрузить', 'info.txt'); link.href = makeTextFile (textbox.value);  document.body.appendChild (link);//ждем, пока ссылка будет добавлена ​​в документ window.requestAnimationFrame (function () {var event = new MouseEvent ('click'); link.dispatchEvent (event); document.body  .removeChild (ссылка);});}, false);  

Поделиться
отредактировано 23 мая ’17 в 11:47
Сообщество ♦
111 серебряный значок
ответил 09 янв., в 9:23
  • 1
    @FirstBlood Какая часть не работает, вы получаете сообщение об ошибке? Создание файла и ссылки должно работать в Safari 7+ (я считаю, что этот материал также должен работать с Safari 6, если вы используете версию с префиксом URL ). Установка имени файла не будет работать в Safari, так как в нем еще не реализован атрибут download . — Бесполезный код 15 апр. 2015, 16:36
  • 1
    Я пробовал это на Safari 5.1 🙂 — Первая кровь, 16 апреля 2015, 19:16
  • 1
    в сохраненном документе отсутствует символ новой строки — Бенни, 28 июня 2015 г., 06:15
  • 1
    @Benny, символы новой строки там. JS использует символ новой строки n для представления новых строк, как это делают программы UNIX. Вероятно, вы просматриваете его в программе Windows, такой как Блокнот, которая не отображает символ n как новую строку. Если вы хотите, чтобы символы новой строки правильно отображались в Блокноте и некоторых других программах Windows, перед помещением текста в Blob замените каждый n на r n : text = text.replace (/ n/g, ' r n') . — Бесполезный код, 30 июня 2015 г., 3:09
  • 2
    @ user3241111 Не совсем, должно работать. В подобных вещах нет ничего необычного. Я видел хакерские способы сделать это 😉 Раньше мне также удавалось просто генерировать файл с помощью mouseover по ссылке, но в зависимости от того, сколько обработки он выполняет это может не сработать. — Бесполезный код, 22 июля ’16 в 11:18
| показать 4 дополнительных комментария

Вы можете создавать файлы в браузере, используя Blob и URL.createObjectURL . Все современные браузеры поддерживают это.

Вы не можете напрямую сохранить созданный файл, так как это может вызвать серьезные проблемы с безопасностью, но вы можете предоставить его как ссылку для загрузки для пользователя. Вы можете предложить имя файла с помощью атрибута download ссылки в браузерах, которые поддерживают атрибут загрузки. Как и при любой другой загрузке, последнее слово по поводу имени файла будет за пользователем, загружающим файл.

  var textFile = null, makeTextFile = function (text) {var data  = новый Blob ([текст], {тип: 'текст/простой'}); //Если мы заменяем ранее сгенерированный файл, нам нужно//вручную отозвать URL объекта, чтобы избежать утечки памяти.  если (textFile! == null) {window.URL.revokeObjectURL (textFile);  } textFile = window.URL.createObjectURL (данные); //возвращает URL-адрес, который можно использовать как href return textFile;  };  

Вот пример, в котором этот метод используется для сохранения произвольного текста из textarea .

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

  var create = document.getElementById ('create'), textbox = document.getElementById ('textbox');  create.addEventListener ('клик', функция () {var link = document.createElement ('a'); link.setAttribute ('загрузить', 'info.txt'); link.href = makeTextFile (textbox.value);  document.body.appendChild (link);//ждем, пока ссылка будет добавлена ​​в документ window.requestAnimationFrame (function () {var event = new MouseEvent ('click'); link.dispatchEvent (event); document.body  .removeChild (link);});}, false);  

44

Если вы говорите о javascript браузера, вы не можете записывать данные непосредственно в локальный файл по соображениям безопасности. Новый API HTML 5 может разрешить вам только чтение файлов.

Но если вы хотите записывать данные, и разрешите пользователю загружать как файл на локальный. работает следующий код:

  загрузка функции (strData, strFileName, strMimeType) {var D = document, A = arguments, a = D.createElement ("a"), d  = A [0], n = A [1], t = A [2] ||  "текст/обычный"; //создаем ссылку для скачивания: a.href = "data:" + strMimeType + "charset = utf-8," + escape (strData);  if (window.MSBlobBuilder) {//IE10 var bb = new MSBlobBuilder ();  bb.append (strData);  вернуть navigator.msSaveBlob (bb, strFileName);  }/* конец if (window. MSBlobBuilder) */if ('загрузить' в) {//FF20, CH19 a.setAttribute ("загрузить", n);  a.innerHTML = "загрузка ...";  D.body.appendChild (а);  setTimeout (function () {var e = D.createEvent ("MouseEvents"); e.initMouseEvent ("клик", истина, ложь, окно, 0, 0, 0, 0, 0, ложь, ложь, ложь, ложь,  0, ноль); a.dispatchEvent (e); D.body.removeChild (a);}, 66);  вернуть истину;  }; /* end if ('download' in a) *///делаем iframe dataURL download: (более ранняя версия W3) var f = D.createElement ("iframe");  D.body.appendChild (f);  f.src = "data:" + (A [2]? A [2]: "application/octet-stream") + (window.btoa? "; base64": "") + "," + (window.  btoa? window.btoa: escape) (strData);  setTimeout (функция () {D.body.removeChild (f);}, 333);  return true;}  

, чтобы использовать его:

download ('содержимое файла', 'filename.txt' , 'text/plain');

Поделиться
Создан 09 янв. в 06:11
  • 1
    Вышеупомянутое решение немного устарело. Возможно, вам придется рассмотреть html 5 javascript lib. github.com/eligrey/FileSaver.js — Lifecube, 15 июня 2016 г., 07:27
  • @Lifecube с использованием FileSaver.js, есть ли способ автоматически сохранять текст в файл без взаимодействия с пользователем? Благодаря! Новое в JS; вся ваша помощь приветствуется — Натан, 16 июня ’18, 22:00
  • 3
    На несколько вопросов о сохранении файла без ведома пользователя: Такое поведение как раз и избегается при разработке. Это откроет ящик Пандоры простых в использовании угроз безопасности. Файлы cookie предназначены для сбора данных в маркетинговых целях. — Ари Окконен, 18 окт., 12:36
  • Примечание. Я не могу получить это, чтобы загрузить файл html как .html в firefox v76 в Windows 10. В конце загрузки добавлен .pdf. — CSchwarz 8 мая ’20 в 3:43
  • Другой разработчик саркастичен? — Стивен Даффи 02 июл. ’20 в 13:45
добавить комментарий |

Если вы говорите о javascript браузера, вы не можете записывать данные непосредственно в локальный файл по соображениям безопасности. Новый API HTML 5 может разрешить вам только чтение файлов.

Но если вы хотите записывать данные, и разрешите пользователю загружать как файл на локальный. работает следующий код:

  загрузка функции (strData, strFileName, strMimeType) {var D = document, A = arguments, a = D. createElement ("a"), d = A [0], n = A [1], t = A [2] ||  "текст/обычный"; //создаем ссылку для скачивания: a.href = "data:" + strMimeType + "charset = utf-8," + escape (strData);  if (window.MSBlobBuilder) {//IE10 var bb = new MSBlobBuilder ();  bb.append (strData);  вернуть navigator.msSaveBlob (bb, strFileName);  }/* конец if (window.MSBlobBuilder) */if ('download' в) {//FF20, CH19 a.setAttribute ("download", n);  a.innerHTML = "загрузка ...";  D.body.appendChild (а);  setTimeout (function () {var e = D.createEvent ("MouseEvents"); e.initMouseEvent ("клик", истина, ложь, окно, 0, 0, 0, 0, 0, ложь, ложь, ложь, ложь,  0, ноль); a.dispatchEvent (e); D.body.removeChild (a);}, 66);  вернуть истину;  }; /* end if ('download' in a) *///делаем iframe dataURL download: (более ранняя версия W3) var f = D.createElement ("iframe");  D.body.appendChild (f);  f.src = "data:" + (A [2]? A [2]: "application/octet-stream") + (window.btoa? "; base64": "") + "," + (window.  btoa? window.btoa: escape) (strData);  setTimeout (функция () {D.body.removeChild (f);}, 333);  return true;}  

, чтобы использовать его:

download ('содержимое файла', 'filename.txt' , 'text/plain');


24

Попробуйте

  let a = document.createElement ('a')  ; a.href = "data: application/octet-stream," + encodeURIComponent ("My DATA"); a.download = 'abc.txt'; a.click ();  

Если вы хотите загрузить двоичные данные, посмотрите здесь

Update

2020.06.14 Я обновляю Chrome до 83.0 и выше SO остановка сниппета работает (причина: ограничения безопасности песочницы) — но версия JSFiddle работает — здесь

Поделиться
отредактировал 18 июля ’20 в 14:57
ответил 21 апр. ’19 в 16:05
  • Это самый элегантный способ сделать это, что я видел до сих пор, спасибо. — Махмуд К. 28 нояб. ’20 в 12:41
добавить комментарий |

Попробуйте

  let a = document.createElement ('a'); a.href = "data: application/octet-stream," + encodeURIComponent ("My DATA"); a.download = 'abc.txt'  ; a.click ();  

Если вы хотите загрузить двоичные данные, посмотрите здесь

Обновить

2020.06.14 Я обновляю Chrome до 83. 0 и выше SO snippet stop работает (причина: ограничения безопасности песочницы) — но версия JSFiddle работает — здесь


23

Вышеупомянутый ответ полезен, но я нашел код, который помогает вам загружать текстовый файл непосредственно при нажатии кнопки. В этом коде вы также можете изменить filename по своему усмотрению. Это чистая функция javascript с HTML5. Работает на меня!

  function saveTextAsFile () {var textToWrite = document.getElementById ("inputTextToSave"). value;  var textFileAsBlob = новый Blob ([textToWrite], {type: 'text/plain'});  var fileNameToSaveAs = document.getElementById ("inputFileNameToSaveAs"). значение;  var downloadLink = document.createElement ("а");  downloadLink.download = fileNameToSaveAs;  downloadLink.innerHTML = "Загрузить файл";  if (window.webkitURL! = null) {//Chrome позволяет щелкать ссылку//без фактического добавления ее в DOM.  downloadLink.href = window.webkitURL.createObjectURL (textFileAsBlob);  } else {//Firefox требует, чтобы ссылка была добавлена ​​в DOM//перед тем, как по ней можно будет щелкнуть.  downloadLink.href = window.URL.createObjectURL (textFileAsBlob);  downloadLink.onclick = destroyClickedElement;  downloadLink.style.display = "нет";  document.body.appendChild (ссылка для скачивания);  } downloadLink.click ();}  

Поделиться
ответ дан 30 сен ’15 в 05:25
  • 2
    Превосходно. У меня работает в Opera. За исключением необходимости заменить неизвестную функцию: «destroyClickedElement» оператором «document.body.removeChild (event.target)» — steveOw 12 фев 2016, в 0:43
  • 4
    Будьте осторожны при использовании createObjectURL . В отличие от большинства вещей в JS, объекты, которые вы создаете с его помощью, не собираются автоматически, когда на них больше нет ссылок; они собираются только при закрытии страницы. Поскольку вы не используете URL.revokeObjectURL () в этом коде для освобождения памяти, использованной последним вызовом, у вас есть утечка памяти; если пользователь вызывает saveTextFile несколько раз, он будет продолжать использовать все больше и больше памяти, потому что вы никогда не освобождали его. — бесполезный код 17 ноя. ’17 в 13:22
добавить комментарий |

Вышеупомянутый ответ полезен, но я нашел код, который помогает вам загружать текстовый файл непосредственно при нажатии кнопки. В этом коде вы также можете изменить filename по своему усмотрению. Это чистая функция javascript с HTML5. Работает на меня!

  function saveTextAsFile () {var textToWrite = document.getElementById ("inputTextToSave"). value;  var textFileAsBlob = новый Blob ([textToWrite], {type: 'text/plain'});  var fileNameToSaveAs = document.getElementById ("inputFileNameToSaveAs"). значение;  var downloadLink = document.createElement ("а");  downloadLink.download = fileNameToSaveAs;  downloadLink.innerHTML = "Загрузить файл";  if (window.webkitURL! = null) {//Chrome позволяет щелкать ссылку//без фактического добавления ее в DOM.  downloadLink.href = window.webkitURL.createObjectURL (textFileAsBlob);  } else {//Firefox требует, чтобы ссылка была добавлена ​​в DOM//перед тем, как по ней можно будет щелкнуть.  downloadLink.href = window.URL.createObjectURL (textFileAsBlob);  downloadLink.onclick = destroyClickedElement;  downloadLink.style.display = "нет";  document.body.appendChild (ссылка для скачивания);  } downloadLink.click ();}  

7

В случае, если невозможно использовать новое решение Blob , которое, безусловно, является лучшим решением в современном браузере, все еще можно использовать этот более простой подход, который кстати имеет ограничение на размер файла:

  function download () {var fileContents = JSON.stringify (jsonObject, null, 2);  var fileName = "data.json";  var pp = document.createElement ('a');  pp.setAttribute ('href', 'данные: текст/простой; кодировка = utf-8,' + encodeURIComponent (fileContents));  pp.setAttribute ('скачать', имя_файла);  pp.click ();  } setTimeout (function () {download ()}, 500);  

  $ ('# download'). on ("click", function () {function download () {var jsonObject = {"name": "John", "age": 31, "city": "Нью-Йорк  "}; var fileContents = JSON.stringify (jsonObject, null, 2); var fileName =" data.json "; var pp = document.createElement ('a'); pp.setAttribute ('href', 'data: text /plain; charset = utf-8, '+ encodeURIComponent (fileContents)); pp.setAttribute (' download ', fileName); pp.click ();} setTimeout (function () {download ()}, 500);});  );  
      

Поделиться
ответил 19 апр. ’18 в 14:56
добавить комментарий |

В случае, если невозможно использовать новое решение Blob , это это, безусловно, лучшее решение в современном браузере, все еще можно использовать этот более простой подход, который, кстати, имеет ограничение на размер файла:

  function download ()  {var fileContents = JSON.stringify (jsonObject, null, 2); var fileName = "data.json"; var pp = document.createElement ('a'); pp.setAttribute ('href', 'data: text/plain  ; charset = utf-8, '+ encodeURIComponent (fileContents)); pp.setAttribute (' download ', fileName); pp.click ();} setTimeout (function () {download ()}, 500);  

  $ ('# download'). on ("click", function () {function download  () {var jsonObject = {"имя": "Джон", "возраст": 31, "город": "Нью-Йорк"};  var fileContents = JSON.stringify (jsonObject, null, 2);  var fileName = "data.json";  var pp = document.createElement ('a');  pp.setAttribute ('href', 'данные: текст/простой; кодировка = utf-8,' + encodeURIComponent (fileContents));  pp.setAttribute ('скачать', имя_файла);  pp.click ();  } setTimeout (function () {download ()}, 500);});  
    


3

Используйте код пользователя @ бесполезно- код выше (https://stackoverflow.com/a/21016088/327386) для создания файла. Если вы хотите загрузить файл автоматически, передайте только что сгенерированный textFile этой функции :

  var downloadFile = function downloadURL (url) {var hiddenIFrameID = 'hiddenDownloader', iframe = document.getElementById (hiddenIFrameID);  если (iframe === null) {iframe = document.createElement ('iframe');  iframe.id = hiddenIFrameID;  iframe.style.display = 'нет';  document.body.appendChild (iframe);  } iframe. src = url;}  

Поделиться
отредактировано 23 мая ’17, 10:31
Сообщество ♦
111 серебряных значков
ответил 19 февраля 2015 в 19:43
  • 5
    Не знаю, почему голосование было против. Меня устраивает. Люди, которые проголосовали против, должны хотя бы оставить комментарий о том, почему это было отклонено! — RPM 8 апреля 2015, 17:59
  • 5
    Я не голосовал против, но на самом деле комментировать голосование прямо не рекомендуется. Пользователь должен комментировать содержание сообщения и голосовать за содержание сообщения, но они не должны комментировать свои голоса. Если кто-то голосует без комментариев, вы можете понять, что это означает «этот ответ полезен» или «этот ответ бесполезен» в зависимости от количества поданных голосов. — user4639281, 16 дек. ’15 в 7:16
  • Это не работает .. Он не загружает файл. Он просто создает скрытый iframe. Я тестировал Chrome и firefox — NaiveCoder 17 августа 2016 г., 06:47
добавить комментарий |

Используйте код пользователя @ бесполезный-код выше (https://stackoverflow.com/a/21016088/327386) для создания Если вы хотите загрузить файл автоматически, передайте только что сгенерированный textFile в эту функцию:

  var downloadFile = function  downloadURL (url) {var hiddenIFrameID = 'hiddenDownloader', iframe = document.getElementById (hiddenIFrameID);  если (iframe === null) {iframe = document.createElement ('iframe');  iframe.id = hiddenIFrameID;  iframe.style.display = 'нет';  document.body.appendChild (iframe);  } iframe.src = url;}  

2

Я нашел здесь хорошие ответы, но нашел и более простой способ.

Кнопка для создания большого двоичного объекта и ссылка для загрузки могут быть объединены в одну ссылку, поскольку элемент ссылки может иметь атрибут onclick. (Обратное кажется невозможным, добавление href к кнопке не работает.)

Вы можете стилизовать ссылку как кнопку, используя bootstrap , который все еще остается чистый javascript, за исключением стилизации.

Комбинирование кнопки и ссылки для загрузки также сокращает объем кода, поскольку требуется меньше этих уродливых вызовов getElementById .

В этом примере достаточно одного нажатия кнопки, чтобы создать текстовый блок и загрузить его:

   Запись в файл  //URL, указывающий на большой двоичный объект с содержимым файла var objUrl = null;//создаем большой двоичный объект с содержимым файла и прикрепляем URL к ссылке для скачивания;//NB: ссылка должна иметь атрибут загрузки//это  может перейти к вашей библиотечной функции exportFile (fileContent, downloadLinkId) {//отменить URL старого объекта, чтобы избежать утечки памяти. if (objUrl! == null) {window.URL.revokeObjectURL (objUrl);}//создать объект  который содержит данные файла и на который можно ссылаться с помощью URL-адреса var data = new Blob ([fileContent], {type: 'text/plain'}); objUrl = window.URL.createObjectURL (data);//прикрепляем  объект ссылки для загрузки (оформленный как кнопка) var downloadLinkButton = document.getElementById (downloadLinkId); downloadLinkButton.href = objUrl;};   

Поделиться iv>
ответил 12 июля ’18, 11:56
  • заблокировано касперским: (- Lokinou, 12 окт., В 17:34
  • @Lokinou Security убер все, но знаете ли вы, почему он заблокирован? — Роланд, 14 октября 2020 г., 15:47
  • я предполагаю предотвратить загрузку нежелательных файлов без действий пользователя. — Lokinou 21 окт. ’20 в 23:09
добавить комментарий |

Я нашел здесь хорошие ответы, но нашел и более простой способ.

Кнопка для создания капли а ссылку для скачивания можно объединить в одну ссылку, так как элемент ссылки может иметь атрибут onclick. (Обратное кажется невозможным, добавление href к кнопке не работает.)

Вы можете оформить ссылку как кнопку, используя bootstrap , который все еще остается чистый javascript, за исключением стилизации.

Комбинирование кнопки и ссылки для загрузки также сокращает объем кода, поскольку требуется меньше этих уродливых вызовов getElementById .

В этом примере достаточно одного нажатия кнопки, чтобы создать текстовый блок и загрузить его:

   Write To File  //URL, указывающий на большой двоичный объект с содержимым файла var objUrl = null;//создаем большой двоичный объект с содержимым файла и прикрепляем URL к  the downloadlink;//NB: ссылка должна иметь атрибут загрузки//этот метод может перейти к вашей библиотечной функции exportFile (fileContent, downloadLinkId) {//отменить URL старого объекта, чтобы избежать утечки памяти. if (objUrl! == null)  {window.URL.revokeObjectURL (objUrl);}//создаем объект, содержащий данные файла, на который можно ссылаться с помощью URL-адреса var data = new Blob ([fileContent], {type: 'text/plain'})  ; objUrl = window.URL.createObjectURL (data);//прикрепляем объект к ссылке для скачивания (оформлен как кнопка) var downloadLinkButton = document.getElementById (downloadLinkId); downloadLinkButton.href = objUrl;};  код> 

2

   const data = {name: 'Ro  nn ', возраст: 27}; //образец jsonconst a = document.createElement ('a'); const blob = new Blob ([JSON.stringify (data)]); a.href = URL.createObjectURL (blob); a.download = 'sample-profile  '; //имя файла для загрузкиa.click ();  

Проверьте документацию по Blob здесь — Blob MDN, чтобы указать дополнительные параметры для типа файла. По умолчанию будет создан файл .txt

Поделиться
ответил 11 августа ‘ 20 в 20:31
добавить комментарий |

  const data = {name: 'Ronn', age: 27}; //образец jsonconst a = document.createElement ('a'); const blob = new Blob ([JSON.stringify (data)]); a.href = URL.createObjectURL (blob); a.download = 'sample-profile  '; //имя файла для загрузкиa.click ();  

Проверьте документацию по Blob здесь — Blob MDN, чтобы указать дополнительные параметры для типа файла. По умолчанию будет создан файл .txt


-1

Да это возможно Здесь код

   const fs = require ('fs') let data = "Учимся писать в файл." fs.writeFile ('Output.txt', data, (err) => {//В случае ошибки выбросить err. если (ошибка) бросить ошибку;  }) 

Поделиться
22 июня ’20 в 22:05
добавить комментарий |

Да это возможно Вот код

  const fs = require ('fs') let data = "Учимся писать в файл." fs.writeFile ('Output.txt  ', data, (err) => {//В случае ошибки выбросить err. if (err) throw err;}) 

Оцените статью
Botgadget.ru
Добавить комментарий