#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 — Рад, что это было полезно.