Основы работы с Node JS. Часть - 1.
Node.js — это среда выполнения JavaScript, построенная на JavaScript-движке V8 из Chrome. В основе Node.js лежит событийно-управляемая модель с неблокирующими операциями I/O, что делает её легкой и эффективной.
Все материалы по JavaScript
Другими словами: Node.js предлагает вам возможность писать невероятно производительный серверный код с использованием JavaScript. Как говорится в официальном описании: Node.js — это среда выполнения, использующая тот же JavaScript-движок V8, который вы можете найти в браузере Google Chrome.
Функции
- Простая:
- Именованная:
- Функция из функции:
function hello(){
console.log('Hello Proger');
};
hello();
var someName = function(){
console.log("SomeName Function");
};
someName();
function call(func){
func();
};
call(someName);
Модули
В файл array.js запишем:
let array_counter = function ( array ) {
return 'В массиве находится ' + array.length + ' элементов.';
};
console.log( array_counter( [ 1, 33, 45, 23, 7, 31, 40 ] ) );
Подключение к index.js
require('./array');
Если мы подключаем какой-то файл, то это не значит, что мы можем использовать все функции из этого файла.
Например, если вывод в консоль перенести из файла array.js в index.js, то получим ошибку.
Если из файла нужно что-то просто вывести, то достаточно подключить, как в примере выше. а если использовать функции вне модуля, нам нужно их экспортировать.
- Используется метод
modelr.exports = name_function; - Директиве
require('./array');присвоить переменную.
let counter = require('./array');
console.log( counter( [ 1, 33, 45, 23, 7, 31, 40 ] ) );
Файл array.js
let array_counter = function ( array ) {
return 'В массиве находится ' + array.length + ' элементов.';
};
module.exports = array_counter;
Несколько функций из одного модуля.
let array_counter = function ( array ) {
return 'В массиве находится ' + array.length + ' элементов.';
};
let some_value = 324;
let multiplay = function(x, y){
return `Число ${x} умножить на ${y} = ${x * y} `;
};
module.exports.array_counter = array_counter;
module.exports.some_value = some_value;
module.exports.multiplay = multiplay;
Файл index.js
let things = require('./things.js');
console.log( things.array_counter( [ 1, 33, 45, 23, 7, 31, 40 ] ) );
console.log(things.some_value);
console.log(things.multiplay(4, 8));
Упростим
module.exports.array_counter = function ( array ) {
return 'В массиве находится ' + array.length + ' элементов.';
};
module.exports.some_value = 324;
module.exports.multiplay = function(x, y){
return `Число ${x} умножить на ${y} = ${x * y} `;
};
let array_counter = function ( array ) {
return 'В массиве находится ' + array.length + ' элементов.';
};
let some_value = 324;
let multiplay = function(x, y){
return `Число ${x} умножить на ${y} = ${x * y} `;
};
module.exports = {
array_counter : array_counter,
some_value : some_value,
multiplay : multiplay
};
Отслеживание событий в Node
Подключение встроенных модулей.
Все делается через директивуrequire('name_modele');
let events = require('events');
Теперь есть подключенный модуль, который отслеживает различные события.
Создадим функцию, которая отслеживает конкретное событие. Её мы и будем вызывать, чтобы убедиться, что событие сработало. Это пример чисто технический. Сами создаем событие и сами его отслеживаем.
Создадим переменную, которая будет отвечать за обработчик события.
let myEmit = new events.EventEmitter();
Для события используем метод
.on(). Первым аргументом - название события, которое отслеживаем. Вторым аргументом запишем функцию. которая будет срабатывать на это событие.
Например:
myEvent.on('click', function(){console.log('Event click'});
Теперь остается только вызвать придуманное нами событие и передать параметр
text.
let events = require('events');
let myEmit = new events.EventEmitter();
myEmit.on('some_event', function(text){
console.log(text);
});
myEmit.emit('some_event', 'Обработчик событй сработал');
Модуль позволяющий наследовать события - Util
- Создали переменную в которую присвоили модуль
util. - Создадим конструктор.
- После этого можно использовать модуль
util, чтобы все объекты созданные на основе этого конструктораCarsунаследовали обработчик событий.
util.inherits(ctor, superCtor);
Первым параметром указываем конструктор, который будет наследовать. Вторым - что конкретно наследовать.
util.inherits(Cars, events.EventEmitter);
Круглые скобки событию не надо.
Теперь мы можем создавать различные объекты, которые будут сразу наследовать обработчик событий.
let events = require('events');
let util = require('util');
let Cars = function(model){
this.model = model;
}
util.inherits(Cars, events.EventEmitter);
let bmv = new Cars('BMW');
let audi = new Cars('Audi');
let volvo = new Cars('Volvo');
На самом деле util.inherits просто позволяет наследовать прототипы от одного конструктора к другому (не только конструктор событий).
Посмотрим на практике:
- Создадим массив
cars, в который пометим все объекты, которые мы создали. - Теперь ы легко можем перебирать массив и объекты в нем.
- Вызываем события.
let cars = [bmv, audi, volvo];
cars.forEach(function(car){ car.on('speed', function(text){ console.log( `Auto ${car.model} speed is $(text}`)); }); });
bmw.emit('speed', '245.3 km');
Код полностью index.js
let events = require('events');
let util = require('util');
let Cars = function(model){
this.model = model;
}
util.inherits(Cars, events.EventEmitter);
let bmw = new Cars('BMW');
let audi = new Cars('Audi');
let volvo = new Cars('Volvo');
let cars = [bmw, audi, volvo];
cars.forEach(function(car){
car.on('speed', function(text){
console.log( 'Auto ' + car.model + ' speed is ' + text);
});
});
bmw.emit('speed', '245.3 km');
Теперь мы можем добавить различные авто и получить у каждого событие.
bmw.emit('speed', '245.3 km');
volvo.emit('speed', '198 km');
audi.emit('speed', '259 km');
Запись и чтение файлов
Синхронное чтение.
Создадим text.txt файл из которого будем что-то читать.Добавим в него текст:
Файл text.txt.
Ура! Вы меня прочитали! You read this text.
При этом важно указать кодировку, иначе кириллицу отображать не будет.
Читать и записывать файлы поможет модуль
fs. Вызываем его.
fs.readFileSync(path, options);
Первый параметр - файл и путь к нему.
Второй - кодировка. В нашем случае -
'utf8'
Пока не прочитаем файл, код ниже не сработает.
Поместим весь этот текст в переменную
file_readed
let fs = require('fs');
let file_read = fs.readFileSync('text.txt', 'utf8');
console.log(file_read);
Синхронная запись.
Используем тот же модуль, но функциюfs.writeFileSync(path, data, options);
Первый параметр - название файла куда записывать. Если его нет, то он будет создан.Например
some_new_file.txt
Второй параметр - данные (текст). Можно указать просто имя переменной, в которой этот текст.
Например:
let message = 'Hello World - Привет Мир\n' + file_read;
let fs = require('fs');
let file_read = fs.readFileSync('text.txt', 'utf8');
let message = "Hello World - Привет Мир \r\n" + file_read;
fs.writeFileSync('some_new_file.txt', message);
Запустим
node index
Ничего не произойдет в консоли, но зато появится новый файл
some_new_file.txt в нашей директории.
Откроем и там:
Асинхронная.
Отличается тем, что код, который расположен ниже функции будет обрабатываться и не ждать завершения обработки функций чтения и записи.Чтение файлов асинхронное
Функция почти такая же. но есть третий параметр, который есть функция которая сработает тогда. когда файл будет прочтен.В этой функции первым параметром
err - ошибка. Если не получится прочитать файл обратимся к ней, а вторым data - непосредственно данные.
let fs = require('fs');
fs.readFile('text.txt', 'utf8', function(err, data){
console.log(data);
});
console.log('Test');
Вывод слова Test для наглядности асинхронности кода.
Запись файла асинхронная
Используется почти такая же конструкция, что и для чтения.Вторым параметром пойдет тот текст, который мы хотим записать. Можно его поместить в переменную, как и с синхронными функциями.
Третьим параметром функция в которой можно ничего не возвращать.
let fs = require('fs');
fs.readFile('text.txt', 'utf8', function(err, data){
console.log(data);
});
fs.writeFile('some.txt', 'Hello Programmers from me', function(err, data){});
console.log('Test');
Удаление файлов. Создание и удаление директории.
Удаление файлов.
Используется модульfs
let fs = require('fs');
fs.unlinkSync(path);
fs.unlink(path, callback);Первый параметр название файла который удаляем, или путь.
Второй - Функция, которая будет срабатывать, после завершения удаления конкретного файла.
В нее можно ничего не передавать, но она нужна, чтобы не было ошибки.
let fs = require('fs');
fs.unlink('text1.txt', function(){
console.log('File text1 deleted');
});
Создание директории.
fs.mkdirSync(path, mode);
fs.mkdir(path, mode, callback);
Первый параметр - путь (название папки)
Второй - не обязательный при синхроне.
let fs = require('fs');
fs.mkdir('new-test', function(){
fs.writeFile('./new-test/some-new.txt', 'Hello world!', function(){
console.log('everything is done');
});
});
Удаление.
Удалить можно только пустую папку.fs.rmdirSync(path);
fs.rmdir(path, callback);
let fs = require('fs');
fs.unlink('./new-test/some-new.txt', function(){
fs.rmdir('./new-test', function(){
console.log('Удалили файл и папку');
});
});















































