Есть ли Node.js функция для чтения содержимого файла на сервере?

#javascript #node.js #filesystems

#javascript #node.js #файловые системы

Вопрос:

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


Предположим, у меня есть файл на сервере, который НЕ является моим сервером:

 https://example.com/names.txt
 

Есть ли такая функция, чтобы я мог прочитать этот файл как a String или как a Buffer ?

Очевидным решением было бы загрузить файл во временный каталог, прочитать его содержимое, а затем удалить его, но это очень медленно и занимает много строк кода. Есть ли более чистый способ сделать это?

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

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

Ответ №1:

Вам нужно будет сделать запрос на этот сервер для этого файла. (например, запрос GET), используя выбранный вами модуль.

Выполнение запроса с помощью модуля HTTP

Примечание: в примере d в on('data', ...) обратном вызове будет то, что вы хотите.

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

1. Я полагаю, что это способ сделать это. Я надеялся, что будет более чистый способ, но я предполагаю, что это нулевая зависимость, так что…

2. Кроме того, из того, что я могу сказать в HTTP docs, это .on("response", (data) => {/* ... */) скорее, чем .on("data", (data) => {/* ... */}) . (Я считаю, что data событие возвращается, когда был возвращен какой-либо фрагмент данных, а не весь файл, но я не уверен на 100%.)

3. Да, это правильно, я просто поместил эту заметку, чтобы немного помочь.

4. @wibbuffey — Да, data в этом ответе только один фрагмент файла. Для накопления фрагментов требуется больше кода. Вот почему я написал другой ответ об использовании got() библиотеки, которая накапливает все данные для вас и, следовательно, проще в использовании.

5. @jfriend00 Суть вопроса заключалась в том, чтобы ничего не включать (по крайней мере, внешние библиотеки). Для моей цели использование встроенной библиотеки (с которой я уже хорошо знаком) будет работать лучше, чем добавление другой зависимости. Спасибо, несмотря ни на что, мне придется проверить библиотеку на будущее

Ответ №2:

Предполагая, что файл находится на http-сервере, вы можете использовать один из перечисленных здесь модулей http-запросов, чтобы сделать запрос для этого файла. Обычным поведением по умолчанию является получение ответа от http-сервера в память, хотя вы можете поместить его в файл, если хотите.

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

Вот простой пример с использованием моего любимого выбора для этого типа библиотеки модуля got (который имеет встроенную поддержку promise):

 const got = require('got');
got("https://someserver.com/somefile.txt").text().then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});
 

В got библиотеке есть методы .text() .json() и .buffer() для извлечения тела ответа, его синтаксического анализа (при необходимости) и помещения результата в переменную правильного типа. В моем примере выше используется .text() , поскольку вы упомянули получение ответа в виде строки. Если вы хотите, чтобы это было в буфере, вы бы использовали .buffer() вместо этого.

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

1. Более месяца спустя возвращение к этому конкретному ответу очень помогло, и мне до сих пор не ясно, почему я тогда не пометил ваш ответ как правильный. Теперь у меня есть.

2. @wibbuffey — Рад, что это было полезно.