Серверны Javascript

Мы нарэшце скончылі разбірацца з Javascript які выконваецца ў браўзеры. Надыйшоў час рухацца далей і пазнаёміцца з Javascript, які выконваецца на сервере.

Раней, мы казалі што наш Javascript выконвае браўзер. Зараз наш Javascript будзе выконваць спецыяльная праграма якая завецца nodejs. Спампуйце і ўсталюйце яе на комп. Каб упэўніцца што ўсё атрымалася – выканайце node -v у кансолі Windows. Павінна адлюстравацца нешта накшталт v0.10.32.

Зараз Javascript код можна выконваць у праграме node. Паспрабуйце выканаць наступнае:

  • node

Адчынніца кансоль node у якой можна выконваць Javascript код. Паспрабуйце:

  • 1+3
  • 4

Javascript і Sqlite

Зараз калі Вы ўжо ведаеце як працаваць з базамі дадзеных нам трэба навучыць Javascript рабіць тое ж самае.

Спачатку нам трэба пазнаёміцца з выдатнай рэччу якая ёсьць у node.js – гэта Node Package Manager. Node Package – гэта маленькая праграма (бібліятэка) якая ўсталёўваецца ў Вашае прыкладаньне і дадае яму якія-небудзь функцыі. Гэтак жа як на айфоне або на андроідзе Вы маеце маркет, з якога можна ўсталяваць розныя прыкладаньні, так і тут ёсьць нешта накшталт маркета, зь якога можна ўсталяваць патрэбныя пэкэджы.

Пэкэдж для працы з sqlite3 завецца sqlite3 :) Каб яго ўсталяваць у кансолі нам трэба выканаць у кансолі Windows:

  • npm install sqlite3
  • npm install https://github.com/mapbox/node-sqlite3/tarball/master

Мы ўжо можам карыстацца гема, але спачатку нам трэба стварыць новую базу дадзеных. Адчыніце кансоль і стварыце новую базу дадзеных address-book.db з табліцай contacts якая маё калёнку для id primary key і калёнку name.

Зараз у кансолі node выканайце:

  • var sqlite3 = require('sqlite3').verbose()
  • var db = new sqlite3.Database('address-book.db')
  • db.run('insert into contacts(name) values("Ales")');

Даволі проста – аргумэнт у мэтада run – гэта проста радок які інтэрпрэтуецца як SQL.

Дадайце яшчэ некалькі кантактаў.

Зараз давайце паглядзім што будзе калі выканаць сэлект:

  • db.all('select * from contacts', function(err, data){ console.log(data)} )
  • { id: 1, name: 'Ales' }

Зразумела. Вяртаецца масіў. Як жа нам прабегчыся па сьпісу запісаў? Вядома – цыкл!

  • db.each('select * from contacts', function(err, row){ console.log(row) })

Ключ – гэта назва калёнкі а значэньне – гэта значэньне запіса.

Так як мэтад run проста выконвае каманду SQL мы таксама маглі стварыць табліцу з дапамогай яго. Але стварэньне й зьмяньне табліцаў – заданьне якое выконваецца аднойчы: спачатку Вы ствараеце схему базы дадзеных а потым прыкладаньне проста ведае (выкарыстоўвае) гэтую схему. Таму нашмат лепей і прасьцей рабіць зьмены са структурай базы дадзеных праз кансоль, а не праз праграму.

Сьпіс to-do

Давайце пабудуем прыкладаньне якое будзе захоўваць сьпіс спраў якія трэба выканаць. У тэчцы праекта стварыце файл index.js – зараз гэта будзе асноўны файл праграмы.

Таксама не забудзьцеся на стварэньне базы дадзеных – tasks.db. У ёй павінна быць табліца tasks з калонкамі id, name, status (integer: 1 – выканана; 0 – невыканана).

Пачынаем з інтэрфэйса карыстальніка (Зараз ён будзе трохі іншы, чым раней, бо мы будзем працаваць у кансолі):

Усталюем яшчэ адзін пэкэдж які дазваляе запытваць дадзеныя ў карыстальніка ў кансолі (знаёмая назва дарэчы):

  • npm install prompt

Потым:

index.js
var prompt = require('prompt');
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('tasks.db');

function listTasks(){
}

function addTask(name){
}

prompt.get(['command'], function (err, result) {
   if (result.command == 'list'){
      listTasks();
   } else if (result.command == 'add'){
      prompt.get(['name'], function(err, nameResult){
         addTask(nameResult.name)
      })
   } else {
      console.log('Incorrect command')
   }
});

Што па ідэі павінна адбывацца вышэй? У карыстальніка запытваецца каманда якую ён павінен надрукаваць з клавіятуры. У залежнасці ад назва каманды выконваецца адпаведны мэтад. Для каманды list гэта listTasks, а для каманды add запытваецца назва заданьні і выконваецца мэтад addTask. Т.б. Ваша задача зараз – рэалізаваць гэтыя мэтады.

Спачатку дададзім мэтад listTasks:

index.js
...
function listTasks(){
   db.each('select * from tasks', function(err, task){
      console.log(task.name + ": " + (task.status == 1 ? 'done' : ''));
   })
}
...

У прынцыпе ўсё зразумела – нічога складанага. Зараз addTask (з інтэрфэйса бачна што ён павінен прымаць параметр name).

...
function addTask(name){
   db.run('insert into tasks(name, status) values("' + name + '", 0)');
}
...

Зараз самастойна рэалізуйце мэтад markDone(id) які будзе адзначаць заданьне як выкананае. Дадайце магчымасьць выводзіць толькі невыкананыя заданьні.

Простая адрасная кніга

Гэта праграма будзе адраснай кніжкай для карыстальнікаў каб яны мелі магчымасьць захоўваць дадзеныя сваіх кантактаў. Вы пачнеце з вельмі простай функцыянальнасьці й паступова будзеце дадаваць слаі ў яе.

Вось тое што кажа нам наш карыстальнік, які хоча выкарыстоўваць нашу праграму:

  • Як карыстальнік, я хачу дадаваць кантакты ў сваю адрасную кнігу, каб захоўваць у адным месцы.
  • Як карыстальнік, я хачу захоўваць імя, імэіл, тэлефон і паштовы адрас для кожнага з маіх кантактаў.
  • Як карыстальнік, я хачу мець магчымасьць праглядзець сьпіс імэйлаў якія я маю.
  • Як карыстальнік, я хачу мець магчымасьць выбраць кантакт і праглядзець усю інфармацыю пра яго.
  • Як карыстальнік, я хачу рэдагаваць кантакт калі дадзеныя чалавека зьмяняюцца.
  • Як карыстальнік, я хачу мець магчымасьць выдаляць тыя кантакты, якія мне больш не патрэбны.

Дамашні, рабочы, мабільны

Ня часта зараз сустрэнеш чалавека, які мае толькі адзін тэлефон. Дадавайце дададзім гэта да адраснай кнігі.

  • Як карыстальнік, я хачу захоўваць дамашні, рабочы й мабільны нумары для маіх кантактаў.
  • Як карыстальнік, я хачу захоўваць рабочы й асабісты імэіл чалавека.

Валідацыя дадзеных

Часам адбываецца так, што Вы друкуючы імэіл робіце памылку, й, напраклад, забывайцеся дадаць знак @. Вядома гэта ня правільны імэіл. Таму наша праграма павінна такія данныя не прымыць.

  • Як карыстальнік, я хачу атрымлівацць паведмаленьне аб памылцы тады калі нумар тэлефона менш або больш за 12 лікаў (+375 12 3456789).
  • Як карыстальнік, я хачу атрымліваць паведамленьне аб памылцы тады калі ўведзены ня правільны імэіл.
  • Як карыстальнік, я хачу каб праграма адлюстроўвала тэлефоны ў фармаце (+375 29 123-45-67).

Некалькі падказак.

Каб праверыць імэіл вам трэба пазнаёміцца з тым што такое рэгулярны выраз, або regex. Знайдзіце дакумэнтацыю Рубі пра гэта ў сеціве.

Стварыце мэтад valid() які кажа ці прайшоў аб’ект валідацыю.

Калі аб’ект не прайшоў валідацыю, вяртайце false з мэтада save() і не захоўвайце яго ў базу дадзеных. Калі ён прайшоў валідацыю вяртайце true.

Сістэма кіраваньня чыгункай

Стварыце праграму якая дазволіць кіраваць чыгуначнай сістэмай. Яна павінна дазваляць апэратарам чыгункі дадаваць станцыі а карыстальнікам чыгункі праглядаць яе.

  • Як апэратар чыгункі я хачу мець магчымасьць дадаваць новыя станцыі.
  • Як апэратар чыгункі я хачу мець магчымасьць дадаваць новыя лініі паміж станцыямі.
  • Як карыстальнік чыгункі, я хачу мець магчымасьць праглядзець усе станцыі на адной лініі.
  • Як карыстальнік чыгункі, я хачу мець магчымасьць праглядзець усе накірункі ў якіх ідуць цягнікі з гэтай станцыі.

Чыстка Вашага коду

Ці не заўважылі Вы што шмат якога коду ў Вашых прататыпах аднолькавага? Падумайце якога коду можна пазбавіцца і які код можна адрэфактарыць.

Час падумаць над Вашым праектам

Падумайце якія “Як карыстальнік…” Вы маеце для Вашага праекта. Якім Вы яго бачыце. Стварыце сьпіс такіх патрабаваньняў. Потым схему ўзаемаадносін паміж мадэлямі ў WWW SQL Designer.

Папярэдні занятак Наступны занятак