Чтение файла с Node.js - блокирующее и неблокирующее

fs readFile readFileSync

Если вы хотите сделать веб-сервер на 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);


Author

Gabor Szabo (szabgab) Gabor Szabo