node.js start

13.04.2021

Запускаем на Android

Необходим Termux (Скачать Яндекс диск 4pda)
Установку подглядывал тут.
apt update apt install coreutils apt install nano apt install nodejs mkdir t1 cd t1 touch app.js nano app.js console.log('NodeJS running on Android'); ctrl x node app.js

На комп

Подглядывал с видео уроков Гоши.
Более подробные примеры с описанием тут.
Скачиваем и устанавливаем node.js c nodejs.org
Далее создаём файлик app.js в который закидываем этот код
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World'); }); server.listen(port, hostname, () => { console.log('Server running at http://' + hostname + ':' + port + '/'); });
Далее, в этой же папке, открываем консоль и пишем туда
node app.js // Чтобы остановить // Зажимаем CTRL и нажимаем С
Чтобы узнать версию
node -v
Простая навигация по страницам и счётчик
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; var p = 0; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); if(req.url === '/'){ p++; res.end('eeee ' + String(p)); }else{ res.end('404'); } }); server.listen(port, hostname, () => { console.log('Open http://' + hostname + ':' + port + '/'); });
Немного глобальных переменных
console.log(__dirname); // путь к нашему файлу, кроме названия console.log(__filename); // путь к нашему файлу console.log(req.query);
Подключение файлов
В этой же папке создаём 1.js
И в наш основной файл добавляем
require('./1');
Он выполняется, но мы не можем использовать все функции, которые есть в подключаемом файле, для того, чтобы отдать функцию с подключаемого файла:
// В 1.js прописываем var function_name = function(){ console.log('hw2'); } module.exports = function_name; // А в файле app.js var fun2 = require('./1'); fun2(); // Чтобы передать несколько функций, то помещаем их в объект module.exports = { 'f1': function_name, 'f2':hw3 } // А с того файла, где принимаем, используем как объект с функциями var fun2 = require('./1'); fun2.f1();
Чтобы отслеживать события
var events = require('events'); var myEmit = new events.EventEmitter(); // Создать событие myEmit.on('click1', function(text){ console.log(text); }); // Вызвать событие myEmit.emit('click1', 'HW5');
Херь, чтобы отслеживать создание объектов
var events = require('events'); var util = require('util'); // ООП var Cars = function(model){ this.model = model; } util.inherits(Cars, events.EventEmitter); var bmw = new Cars('BMW'); var audi = new Cars('Audi'); var volvo = new Cars('Volvo'); var cars = [bmw, audi, volvo]; cars.forEach(function(car){ car.on('speed', function(text){ console. log (car.model + " speed is - " + text); }); }); bmw.emit('speed', '254.5 km');
Работа с файлами
При синхронном код не будет выполняться, пока не сделается функция, при асинхронном код работает на много быстрее
var fs = require('fs'); // Прочитать файл var txt = fs.readFileSync('t.txt', 'utf8'); // Записать файл (создаёт) fs.writeFileSync('t2.txt', 'text2'); // Асинхрон топ! Он быстрее // Для чтения fs.readFile('t.txt', 'utf8', function(err, data){ console.log(data); }); // Для записи fs.writeFile('t.txt', 'Hi', function(err, data){}); // Для удаления fs.unlink('f.txt', function(){}); // Для создания директории fs.mkdir('dir', function(){}); // Для удаления дирректории // Можно удалять только пустые папки fs.rmdir('dir', function(){});
Прочитать содержимое папки
Он присылает массив в виде названий файлов и папок
только названия в виде массива
var fs = require('fs'); fs.readdir('./Описание_files', function(err, items) { console.log(items); });
Запустить минимальный сервак
var http = require('http'); var server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); res.end('hw'); }); server.listen(3000, '127.0.0.1', function(){});
Чтение/запись файла потоком
var fs = require('fs'); var myReadShort = fs.createReadStream(__dirname + '/article.txt', 'utf8'); var myWriteShort = fs.createWriteStream(__dirname + '/news.txt'); myReadShort.on('data', function(chunk){ console.log('new data') ; myWriteShort.write(chunk); }); OR // Можно записать проще myReadShort.pipe(myWriteShort);
Так же можно передавать стрим на страницу и вывод как html
var http = require('http'); var fs = require('fs'); var server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'}); var myReadShort = fs.createReadStream(__dirname + '/p.html', 'utf8'); myReadShort.pipe(res); // Можно записать короче // fs.createReadStream(__dirname + '/p.html', 'utf8').pipe(res); }); server.listen(3000, '127.0.0.1', function(){});
Для отдачи json
var http = require('http'); var server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'}); var ob = {'a1':'b1'}; res.end(JSON.stringify(ob)); }); server.listen(3000, '127.0.0.1', function(){});

Установка библиотек

В той папке, где у нас проект на ноде, прописываем в консоли
npm install express // Для удаления npm uninstall express // Чтобы создать файл, где будет описание проекта npm init // чтобы дополнять описание, какие есть библиотеки, // то в конце дописываем -save npm install express -save
Библиотека express
Позволяет писать условия вывода страниц более коротко
Так же упрощает создание сервера
var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('home'); }); app.get('/news/:id', function(req, res){ res.send('id news: ' + req.params.id); }); app.get('/news2/:id/:name', function(req, res){ res.send('id news: ' + req.params.id + '
name: ' + req.params.name); }); app.listen(3000);
Так же есть шаблонизатор ejs
npm install ejs // Установка // Примеры <h1><%=title%></h1> <ul> <% for(var i = 0; i < ar.length; i++ ){ %> <li><%=ar[i]%></li> <% } %> </ul> <% include blocks/header.ejs %>
Там, где наш проект, необходимо создать папку views
в ней создаём news.ejs
Туда любой кодец html с вставками шаблонов
Сам код приложения будет выглядеть так:
var express = require('express'); var app = express(); app.set('view engine', 'ejs')// шаблон app.get('/', function(req, res){ res.sendFile(__dirname + 'home.html'); }); app.get('/about', function(req, res){ // название файла без .ejs res.render('about'); }); app.get('/news/:id', function(req, res){ res.render('news', {'id':req.params.id}); }); app.listen(3000);
Для стилей и картинок, в корне создаём
/public/css/style.css
Если по ссылке обратиться, то оно не откроется.. Для этого прописываем, с какой папки раздавать физически файлы
/public1 - куда обращается по url
public - в какой они папке физически (куда приходит)
Лучше всегда делать одинаковые
app.use('/public1', express.static('public2'));
Для приёма данных с форм
npm install body-parser var bodyParser = require(body-parser); var urlencodedParser = bodyParser.urlencoded({ extended: false }); app.post('/login', urlencodedParser, function (req, res) { console.log(req.body); // ob res.send('welcome, ' + req.body.username); })
Асинхронная проверка существовании файла
const fs = require('fs') const path = './file.txt' fs.access(path, fs.F_OK, (err) => { if (err) { console.error(err) return } //file exists })
Для отдачи картинки
require("http").createServer((req, res) => { if (req.url === "/") { res.statusCode = 200; res.setHeader("Content-Type", "image/jpeg"); require("fs").readFile("./image.jpg", (err, image) => { res.end(image); }); } }).listen(3000);
Отправка статических файлов без библиотек
const http = require('http') const fs = require('fs') http .createServer(function (request, response) { console.log(`Запрошенный адрес: ${request.url}`) if (request.url.startsWith('/public/')) { // получаем путь после слеша const filePath = request.url.substr(1) fs.readFile(filePath, function (error, data) { if (error) { response.statusCode = 404 response.end('Resourse not found!') } else { response.setHeader('Content-Type', 'text/html') response.end(data) } }) } else { // во всех остальных случаях отправляем строку hello world! response.end('Hello World!') } }) .listen(3000)