Если вы хотите сделать веб-сервер на Node.js или просто какое-то приложение, тогда вам нужно уметь читать файлы.
Node предоставляет библиотеку fs для работы с файловой системой. К примеру, для чтения файлов.
Асинхронное чтение файла (неблокирующее)
"Нормальный" способ чтения файлов в Node.js это чтение асинхронным способом. Это значит, что вы вызываете команду чтения файла и передаете callback, который будет вызван при завершении чтения. Это позволяет работать с несколькими запросами чтения параллельно.
Для этого мы можем использовать метод readFile из класса fs
.
examples/node/non-blocking-read-file.js
var fs = require('fs');
fs.readFile('DATA', 'utf8', function(err, contents) {
console.log(contents);
});
console.log('after calling readFile');
Для начала мы загружаем класс fs
с помощью команды require
. Затем вызываем метод readFile
, который получает 3 параметра: имя файла ('DATA' в нашем случае), кодировку файла ('utf8' в примере) и функцию. Эта функция будет вызывана, когда завершится операция чтения файла. Функция получит два параметра. Первый - информация о каких-либо ошибках, второй - содержимое файла.
Как только программа будет запущена, Node начнет читать файл в фоновом режиме, но продолжит выполнение. Таким образом, сначала будет выполнен вызов console.log('after calling readFile');
, который выведет этот текст в консоль.
Затем, когда содержимое файла будет загружено в память, Node вызовет функцию, которую мы передали в метод readFile
, и она выведет в консоль содержимое файла.
Синхронное чтение файла (блокирующее)
Люди, пришедшие из других языков программирования (из большинства), считают синхронное чтение файлов более очевидным. Я не знаю в какой ситуации вы захотите использовать синхронные операции в Node.js, но я вижу, что много асинхронных функций имеют синхронный вариант, наверное, этим кто-то пользуется.
Для чтения файлов вы можете использовать метод readFileSync из класса fs
:
examples/node/blocking-read-file.js
var fs = require('fs');
var contents = fs.readFileSync('DATA', 'utf8');
console.log(contents);