Printable Version of Topic
Click here to view this topic in its original format
თბილისის ფორუმი > Hello World > ნუბური შეკითხვები nodejs - ში


Posted by: Svani91 13 Nov 2016, 06:36
ნუბური შეკითხვები nodejs - ში

მე დავიწყებ

დაახლოებით 1 თვეა ვარჩევ და მივყვები.
ეხლა მაქვს დასაწერი ვებ აპლიკაცია, რომელიც არც მეჩქარება და საკმაოდ მარტივი crud აპპი უნდა გამოვიდეს საბოლოო ჯამში

გადავწყვიტე გამოვიყენო node express - თან ერთად და ცოტა გამოცდილებაც მივიღო

ბევრი კითხვები მექნება

1) რომელ view engine - ს მირჩევთ? მე 2 ვნახე ჯერ jade(pug) და ejs (ეს მომეწონა, ძველ asp - ს გავს და ახლოს ვარ უფრო)
2) json - თან სამუშაოდ რომელ ბიბლიოთეკას მირჩევთ?
3) რომელი nosql ბაზა გამოვიყენო - თავის ბიბლიოთეკიანად მირჩიეთ
4) amazon web services - თან სამუშაოდაც დამჭირდება ბიბლიოთეკა
5) ყველაზე მთავარი - ჰოსტინგი. heroku ვნახე ჯერ-ჯერობით მე მხოლოდ. სხვა რას მირჩევთ?


უნდა დავტაგო, თუ არ მიწყენს

https://forum.ge/?showuser=11840

Posted by: web_nts 13 Nov 2016, 13:46
Svani91
QUOTE
1) რომელ view engine - ს მირჩევთ? მე 2 ვნახე ჯერ jade(pug) და ejs (ეს მომეწონა, ძველ asp - ს გავს და ახლოს ვარ უფრო)
2) json - თან სამუშაოდ რომელ ბიბლიოთეკას მირჩევთ?
3) რომელი nosql ბაზა გამოვიყენო - თავის ბიბლიოთეკიანად მირჩიეთ
4) amazon web services - თან სამუშაოდაც დამჭირდება ბიბლიოთეკა
5) ყველაზე მთავარი - ჰოსტინგი. heroku ვნახე ჯერ-ჯერობით მე მხოლოდ. სხვა რას მირჩევთ?

1. Mustache-ს ვხმარობ მე, Jadeს ერ მოვეჩვიე ვერაფრით.
2. ვერ მივხვდი რას გულისხმობ spy.gif მაგალითი მოიყვანე აბა რა შემთხვევაში შეიძლება ბიბლიოთეკა დაგჭირდეს ნატივი ფუნქციონალობის გარდა.
3. MongoDB თუ იმენა ბაზა გინდა ნაგრამ ისე Elasticsearch-იც ნახე და დაამუღამე. ტექსტური ძებნისთვის საუკეთედოა.
4. ოფიციალური AWS SDK არსებობს და სხვა ენებთან შედარებით მოხერხებულია უფრო https://aws.amazon.com/documentation/sdk-for-java[ertad]script/
დასაყენებლად გაუშვი npm install aws-sdk
5. ნებისმიერი VPS ცენტოსით ან უბუნტუთი. მე ცენტოსზე ვარ მიჩვეული მაგრამ უბუნტუც კარგია. სასწავლად ვინდოუსზეც უპრობლემოდ მუშაობს.

პროდუქციაში თუ ჩაუშვებ კოდს, აუცილებლად nginx-ის სერვერის უკან იყოს ნოდი. პირდაპირ ნოდის სერვერს არ ენდო ინტერნეტში.

მერე დავწერ უფრო დეტალურად ინსტალაციაზე და სერვერის კონფიგურაციაზე თუ გინდათ.

Posted by: Svani91 13 Nov 2016, 14:48
web_nts

იდეაში ვაპირებდი მეკითხა/მეწერა json ფაილებში, მონგო მეზარებოდა
მაგრამ ეხლა Elasticsearch - ს გადავხედავ

გვინდა კი, დაწერე სერვერის დაკონფიგებაზე up.gif

Posted by: web_nts 13 Nov 2016, 19:09
Svani91
თუ ფაილებად გინდა მაშინ სტრინგად გადააქცევ ობიექტს JSON.stringify(myObject) და შეინახავ ფაილად. წაკითხვითაც ამ ფაილს წაიკითხავ, ობიექტად გადააქცევ უკან სტრინგიდან JSON.parse(stringFromFile) და ეგაა.

ფაილების წასაკითხად/ჩასაწერად გამოიყენებ fs-ს, ნოდის სტანდარტულ ბიბლიოთეკას. ანუ არანაირი გარე მოდული არ გჭირდება. https://nodejs.org/api/fs.html

საერთოდ მოდულები რაც შეიძლება იშვიათად უნდა გამოიყენო და ისიც მხოლოდ კომპლექსური პრობლემებისთვის. მე რაც დავწერე იგივეს ძალიან ბევრი მზა მოდული აკეთებს მაგრამ რეალურად ეს ყველაფერი არის სულ 5 ხაზი. რატომ უნდა იყო დამოკიდებული ვიღაც ტიპის დაწერილ მოდულზე როდესაც შენ თვითონ შეგიძლია იგივეს ან უფრო უკეთესის დაწერა? სხვა საკითხია მოდულები რომლებიც ეხება კრიპტოგრაფიას და სხვა კომპლექსურ მოდულებს. ასეთების დაწერაზე შეიძლება თვეები დაკარგო და ისიც დარწმუნებულო არ იყო ვარგა თუ არა.

მარტივი ფუნქიონალობისთვის არასაჭირო მოდულების გამოყენებამ რა შეიძლება გამოიწვიოს აქ შეგიძლია ნახო http://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/ ერთმა გაბრაზებულმა რამოდენიმე ხაზიანი მოდულის ავტორმა, ლამის ნახევარი ინტერნეტი იმსხვერპლა smile.gif

სერვერის კონფიგურაციის მანუალს სახლიდან დავწერ, ტელეფონით ვარ ეხლა.

Posted by: web_nts 14 Nov 2016, 01:40
* გაფრთხილება:

ეს პოსტი არის განკუთვნილი მათთვის ვინც იცის ელემენტალურ დონეზე ლინუქსთან და ვირტუალურ მანქანებთან მუშაობა! დამწყებისთვის შეიძლება ძალიან საშიში შესახედავი ჩანდეს მაგრამ ასე არ არის, ნოდის სასწავლად ამ ყველაფრის გაკეთება არ გჭირდებათ, ვინდოუსზეც უმარტივესად გადმოწერთ ნოდს ( https://nodejs.org/en/download/ ) და დააყენებთ უმარტივესად, ასე რომ დამწყებები ქვედა პოსტმა არ შეგაშინოთ smile.gif



პროდუქციისთვის მზა ცენტოსის კონფიგურირება NodeJS-ით და NGINX-ით:



პირველ რიგში თუ უკვე მზა VPS გაქვთ რომელსაც ცენტოსით ქირაობთ, მაშინ პირდარ კონფიგურაციაზე შეგიძლიათ გადახვიდეთ, თუ არადა მაშინ შეხვალთ აქ -> https://www.centos.org/download/ და გადმოწერთ "Minimal ISO" ფაილს. შემდეგ ნებისმიერ ვირტუალ მანქანაზე (VirtualBox/VMWare) ან პირდაპირ კომპიუტერზე დააყენებთ ამ .iso ფაილს და შემდეგ დაიწყებთ კონფიგურაციას.

პირველ რიგში შექმნით ახალ იუზერს შეზღუდული შესაძლებლობით, რომელსაც გამოიყენებს მხოლოდ ნოდი და Nginx. მაგალითისთვის დავარქვათ ამ იუზერს "puser" (შეგიძლიათ ნებისმიერი რამე დაარქვათ მაგრამ ქვემოთ მოცემულ ინსტრუქციებში puser-ს გადააწერეთ იმ იუზერის სახელი რასაც თქვენ დაარქმევთ).

პირველ რიგში შევდივართ კონსოლში ადმინისტრატორის უფლებიანი იუზერით ან ვიყენებთ სუდოს და შემდეგ ყველაფერს ვწერთ კონსოლში რაც ქვემოთ წერია.

ვქმნით ახალ იუზერს და პაროლს
CODE
sudo useradd puser

sudo password puser

პირველ რიგში როგორც ყოველთვის ახალი ლინუქსის ინსტალაციისას, ვანახლებთ სისტემას და ვარესტარტებთ:
CODE
sudo yum update

sudo reboot

რესტარტის შემდეგ ვაყენებთ დეველოპმენტ თულს, ვამატებთ ნოდის რეპოზიტორის და ვაყენებთ ნოდს:
CODE
sudo yum groupinstall 'Development Tools'

sudo curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -

sudo yum install nodejs

ნოდის ინსტალაციას და ვერსიას ვამოწმებთ შემდეგი მოთხოვნით:
CODE
node --version

შემდეგ ვამატებს რეპელის რეპოზიტორის და ვაყენებთ NGINX სერვერს და ვამატებთ სტარტაპ სერვისად:
CODE
sudo yum install epel-release

sudo yum install nginx

sudo systemctl enable nginx

ეხლა შევქმნათ ფოლდერი ახალი იუზერის ჰომ დირექტორიაში სადაც განთავსდება ჩვენი ნოდის აპლიკაცია და დავარქვათ myapp (რა თქმა უნდა შეგიძლიათ რაც გინდათ ის დაარქვათ მაგრამ ქვემოთ მოცემულ კონფიგში სადაც შეგხვდებათ myapp, ყველგან გადააწერეთ სასურველი სახელი). ასევე ამავე ფოლდერში შევქმნათ ფოლდერი static სადაც ყველა სტატიკური ფაილები (სურათები/CSS და ასე შემდეგ განთავსდება) და NGINX-ში დაილინკება როგორც სტატიკური ფაილების დირექტორია რათა ნოდიდან არ მოგვიწიოს სტატიკური ფაილების თრევა (ნოდი არ არის გათვლილი სტატიკურ ფაილებთან სამუშაოდ).
CODE
sudo mkdir /home/puser/myapp

sudo mkdir /home/puser/myapp/static

ეხლა მოგვიწევს ფაილების რედაქტირება და თუ vi-ს ხმარება არ იცით გირჩევთ დააყენთ MC ფაილებთან სამუშაოდ:
CODE
sudo yum install mc

mc არის კონსოლის გრაფიკული ფაილ მენეჯერი რომელიც გაგიმარტივებთ დამწყებბებს ფაილებთან მუშაობას.

გასაშვებად კონსოლში ჩაწერთ sudo mc და შეხვალთ სასურველ დირექტორიაში ფაილის დასაედიტებლად... ფაილის გასახსნელად აჭერთ F4-ს, შესანახად F2-ს და ფაილიდან ან თვითონ ფაილ მენეჯერიდან გამოსასვლელად აჭერთ F10-ს.

----------------

შემდეგ ვიწყებთ NGINX-ის კონფიგურაციას... შევდივართ NGINX დირექტორიაში, ვხსნით MC-ს და ვხსნით ფაილს nginx.conf
CODE
cd /etc/nginx

sudo mc

# MC-ის გახსნის შემდეგ F4 ღილაკზე დაჭერით გახსენით ფაილი nginx.conf


კონფიგ ფაილში მოძებნეთ ხაზი სადაც წერია
CODE
user nginx;

და nginx-ის ნაცვლად ჩავწეროთ ჩვენი ახალი იუზერი
CODE
user puser;

შემდეგ ქვემოთ მოვძებნით ხაზს სადაც წერია:
CODE
http {

და ამ ხაზის შემდეგ ჩაამატეთ ეს კოდი:
CODE
# ეს არის მთავარი კონფიგი რომელიც NGINX აკავშირებს ნოდთან

upstream mynodeapp {
   server localhost:3000;
   
   # ამჟამად ეს კონფიგი უსმენს 3000 პორტზე გაშვებულ ნოდის აპლიკაციას,
   # მაგრამ სურვილისამებრ შეგიძლიათ გაუშვათ ზუსტად იგივე აპლიკაცია სხვა პორტებზეც
   # და ამისათვის საჭიროა რომ ქვემოთ მოცემული დაკომენტარებული პორტებს კომენტარები მოხსნათ
   
   #server localhost:3001;
   #server localhost:3002;
   #server localhost:3003;

   # ბევრ პორტზე ერთი და იგივე აპლიკაციის გაშვება იწვევს სერვერის პროცესორის მაქსიმალურად
   # გამოყენებას და დატვირთვის გადანაწილებას რაც გვაძლევს უკეთესს შედეგს, მაგრამ დასაწყისთვის დატოვეთ დაკომენტირებული

   keepalive 64;
}

server {
   # ქვედა ორი ხაზი უთითებს თუ რა პორტს მოუსმინოს
   listen 80;

   # აქ ჩაწერთ სერვერის IP მისამართს/მისამართებს ან დომენს/დომენებს რასაც უნდა მოუსმინოს ნოდმა. ქვემოთ არის დაკომენტარებული მაგალითები
   # server_name 127.0.0.1;
   # server_name 192.168.0.122;
   # server_name mydomain.com www.mydomain.com;
   # ამ შემთხვევაში მოვუსმინოთ IP მისამართს ან გამოიყენეთ რომელიმე ზედა მაგალითი
   server_name 192.168.0.120;
   
   
   # აქ ჩაამატებთ დირექტორიებს ან ფაილებს რაც გინდათ ნოდის გარეშე რომ წამოიღოს სტატიკურად
   location ~ ^/(img/files/|static/|robots.txt|favicon.ico) {
       root /home/puser/myapp/static;
       access_log off;
       expires max;
   }
   
   # "/" ნიშნავს რომ ზემოთ მოცემული სტატიკური ფაილების გარდა ყველა მოთხოვნა გაიგზავნება ნოდზე
   location / {
       proxy_redirect off;
       
       # http ჰედერების გადაგზავნა ნოდისთვის
       proxy_set_header X-Real-IP         $remote_addr;
       proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header Host              $http_host;
       proxy_set_header X-NginX-Proxy     true;
       proxy_set_header Connection        "";

       proxy_http_version     1.1;
       proxy_buffering        off;
       proxy_intercept_errors on;
       
       # ეს არის ყველაზე მთავარი ნაწილი რაც აკავშირებს ამ კონფიგის დასაწყიში განთავსებულ ნოდის პროქსისთან ყველა ლოკაციას
       proxy_pass http://mynodeapp;
   }
}

ეს არის მარტივი კონფიგი თუ როგორ დავაკავშიროთ NGINX ნოდს... NGINX არის უძლიერესი HTTP სერვერი რომელსაც უამარავი კონფიგურაცია აქვს ოღონდ აქ მაგას არ განვიხილავთ.

ამ კოდის კონფიგში ჩამატების შემდეგ, ვინახავთ ფაილს F2 ღილაკზე დაჭერით და გამოვდივართ MC-დან F10 ღილაკზე 2-ჯერ დაჭერით.

ამ ყველაფრის შემდეგ გააკეთებთ რესტარტს კიდევ ერთხელ:
CODE
sudo reboot

და რესტარტის შემდეგ 3000 პორტზე არსებული ნებისმიერი ნოდის აპლიკაცია ჩაიტვირთევა NGINX-ის მეოთხმოცე პორტზე. ანუ ამ კონფიგურაციის შემთხვევაში http://192.168.0.120/ -ზე გაკეთებული რექვესთი გადეცემა 3000 პორტზე გაშვებულ ნოდის აპლიკაციას.


თვითონ ნოდის აპლიკაციის გამართვას რაც შეეხება, ამისთვის საჭიროა შევიდეთ ჩვენი ახალი იუზერით (puser) ტერმინალში და მივყვეთ შემდეგ ინსტრუქციას:

პირველ რიგში დავაყენოთ express.js ჩვენი აპლიკაციის ფოლდერში (გლობალურადაც შეიძლება დაყენება მაგრამ ჯერ არ გვინდა ეს)
CODE
cd /home/puser/myapp

npm install express

შემდეგ ვუშვებთ ინიტ ფუნქციას და ვქმნით აპლიკაციის აღწერას (შეგიძლიათ ყველა კთხვაზე ენთერს დააჭიროთ და დეფოლტ მნიშვნელობებს ჩაწერს)
CODE
npm init

შემდეგ ვქმნით ფაილს მაგალითად app.js და ვანთავსებთ შემდეგ კოდს ამ ფაილში:
CODE
var express = require('express');
var app = express();

app.get('/', function (req, res) {
 res.send('Hello World');
});

app.get('/test', function (req, res) {
 res.send('Hello Test World');
});

app.listen(3000);

ამ აპლიკაციას გავუშვებთ შემდეგნაირად
CODE
node app.js

ამის შემდეგ ნოდი გაშვებული იქნება და NGIX-საც შეუძლია დაუკავშირდეს ამ აპლიკაციას... შესაბამისად თუ შეხვალ ბრაუზერიდან http://192.168.0.120/ -ზე, ეკრანზე დაიწერება "Hello World", ხოლო თუ შეხვალ http://192.168.0.120/test -ზე, ეკრანზე დაიწერება "Hello Test World".

192.168.0.120 რა თქმა უნდა მაგალითად მოყვანილი IP არის, რომელიც უნდა ჩანაცვლდეს nginx.conf ფაილში თვენი სერვერი შესაბამისი IP მისამართით ან დომენით.

ეს არის საწყისი ეტაპი. თუ ზუსტად მიყვებით ინსტრუქციას, ყველაფერი იმუშავებს საათივით smile.gif შეიძლება რამე შეცდომა გამეპარა ამდენი წერის შემდეგ მაგრამ თუ სადმე error ამოგიგდოთ, აქ დაწერეთ ან სქრინი დადეთ და ვნახავ რისი ბრალია.

ასევე ეს კონფიგურაცია არ უშვებს თქვენი ნოდის აპლიკაციას სტარტაპში... რესტარტის ან კონსოლის დახურვის შემდეგ, NGINX ნოდის აპლიკაციას ვერ დაუკავშირდება და ამოგიგდებთ ერორს. ეს ნიშნავს რომ ყოველი კონსოლის გახსნისას უნდა შეხვიდეთ puser-ით ტერმინალში, შეხვიდეთ თქვენი აპლიკაციის ფოლდერში (cd /home/puser/myapp) და გაუშვათ აპლიკაცია ხელით
CODE
node app.js

დასაწყისისთვის ასე ჯობია ვინაიდან ტერმინალშ შეხედავთ თუ რამე შეცდომა დაფიქსირდება, მაგრამ თუ ნოდის აპლიკაციის სტარტაპში დამატება გინდათ და ხელით გაშვება არ გჭირდებოდეთ მომავალში, ესეც ძალიან მარტივია და შემდეგ პოსტებშ დავწერ როგორ დავამატოთ ნოდის აპლიკაცია ცენტოსში სერვისად.

Posted by: Svani91 14 Nov 2016, 02:40
web_nts

რამე ნორმალურ ფასიანი ვიპიეს არ გაქვს დატესტილი რო მირჩიო?

ჰეროკუზე ქოფი ფეისთს, ასე მირჩევნია გავაკეთო

და მადლობა up.gif

Posted by: Roofus 14 Nov 2016, 02:44
Svani91
ატლანტიკი არის კარგი ssd VPS

http://atlantic.net

5$ პლანი აღარ აქვთ ანდა ქონდათ.

+კარგი ტუტორიალია
linux mint-ზე ვცდი როგორ გამომივა nodejs+nginx

Posted by: web_nts 14 Nov 2016, 03:24
Svani91
https://www.ovh.ie/vps/vps-ssd.xml
OVH ყველაზე მუშაა იაფიანი ვიპიესებიდან yes.gif

3 ევროდ (~$3.25) იღებ შემდეგ მონაცემებიან სერვერს: 2GB RAM, 10GB SSD და 1 ვირტუალო პროცესორი 2.4 გიგაჰერცით.

საკმარისზე მეტია ცენტოსისთვის... დაჟე დღეში 5000 ვიზიტორიან საიტს გაქაჩავს თუ კარგი ოპტიმიზაცია აქვს ნოდის კოდს და მარტივი საიტია smile.gif

Posted by: Svani91 14 Nov 2016, 03:31
web_nts
Roofus

მადლობები up.gif

კიდევ მექნება კითხვები, თუ არ შეგაწუხებ

უკვე თვითონ ნოდის აპპს რაც ეხება
ჯერ მხოლოდ როუტები მაქვს გაწერილი და ვაბრუნებინებ html ს პატარა მონაცემებიანად

Posted by: web_nts 14 Nov 2016, 04:00
Svani91
QUOTE
ჯერ მხოლოდ როუტები მაქვს გაწერილი და ვაბრუნებინებ html ს პატარა მონაცემებიანად

რაც მთავარია უნდა იყოს ყველაფერი ასინქრონული up.gif

აი მაგალითად ეს კოდი
CODE
for (var i = 0; i < 10000000; i++) {
   i++;
}

ყველაფერს მიაკლავს სანამ 5 მილიონჯერ არ შესრულდება ეს ლუპი. ეს ცუდი მაგალითია და არც 5 მილიონი ლუპის შესრულება არ არის დიდი საქმე თანამედროვე კომპიუტერებისთვის, მაგრამ წარმოიდგინე რომ ერთდოულად 11-მა ადამიანმა მოითხოვა დაკავშირება ამ გვერდთან სადაც მსგავსი ლუპია... პირველი მთხოვნის შესრულებას დასჭირდა 0.2 წამი შესასრულებლად, მეორე მოთხოვნა სანამ პირველი არ დასრულდება უნდა დაელოდოს 0.2 წამი და შემდეგ თვითონაც 0.2 წამი ასრულოს ეს მოთხოვნა და საბოლოოდ მეათე მოთხოვნას მოუწევს 2 წამი ლოდინი სანამ მისი ჯერი მოვა, ხოლო 2 წამი უკვე ძალიან დიდი დროა ლოდინისთვის. ამას დაუმატე როდესაც ამ ორი წამის განმავლობაში სხვები ცდილობენ შესვლას, რიგი იწელება, დრო იზრდება, ხალხი ცდილობს დაარეფრეშოს გვერდი ამ დაგვიანების გამო და რეალურად პირიქით რიგს ამატებენ. პოპულარულ სერვერზე შეიძლება მუშაობა ჩააგდოს მთელი დღით რამე სინქრონულმა სკრიპტმა. სინქრონული სკრიპტების გარეშე არ გამოვა რა თქმა უნდა (ლუპი ყოველთვის საჭიროა), მაგრამ რაც შეიძლება უნდა ეცადო რომ თავიდან აირიდო.

ნოდში დაწერილი აპლიკაცია არის single threaded აპლიკაცია რაც ნიშნავს რომ სანამ რაღაც სინქრონული მოთხოვნა არ დასრულდება, მანამდე სხვა ყველაფერი გაჩერებულია (ისევე როგორც ბრაუზერის ჯავასკრიპტში, უბრალოდ შენი ბრაუზერის ჯავასკრიპტს ბევრი ადამიანი არ უკავშირდება ერთდროულად და ამიტომ თუნდაც დიდი ლუპები თვალისთვის შესამჩნევ ცვლილებს არ გვაძლევს).

Posted by: Svani91 14 Nov 2016, 04:11
web_nts

2 კვირაა ვკითხულობ და იდეაც ეგაა ნოდის რამდენადაც მე გავიგე

ეხლა ერთი კითხვა მაქვს, დავდებ app.js - ს ფრაგმენტს

არის 2 როუტი და ორივეს სჭირდება ჰედერ ქასთამ დეიტა და არ მინდა რო ესე ვამეორო კოდი, რამე სოლუშენი ხო არ გახსენდება?

CODE

//Include data factory
var dataFactory = require('./dataFactory');

app.get('/', function (req, res) {
   res.render('index.html', {
       sliderData : dataFactory.sliderData,
       headerData : dataFactory.headerData,
       footerData : dataFactory.footerData,
       homeGalleryData : dataFactory.homeGalleryData
   });
})

app.get('/products', function(req, res){
   res.render('product-mirror.html', {
       headerData : dataFactory.headerData,
       footerData : dataFactory.footerData
   });
});


html - ში

CODE
<% include includes/header.ejs %>

Posted by: X2D3T9 14 Nov 2016, 13:06
მოკლედ მაინტერესებს კონკრეტული ლინკები პოსტ გეთ და ფუთ მეთოდით გაგზავნილი მოთხოვნები დაბლოკოს სხვა ჰოსტიდან ....
ჰეადერeბის ამბავია ხომ? დაუწეროს unautorized ...

passport ით ვნახე როგორ კეთდება ავტორიზაცია და შეზღუდვა მაგრამ მე კონკრეტულ მისამართზე მინდა სადაც პასპორტს არ ვიყენებ ...
დაბლოკოს არა მარტო პორველი "პარამეტრი"(არვიცი სწორად როგორ ვთქვა) არამედ ასე

/ლინკი/სრრინგი/სტრინგი

ანუ მთლიანი როუტი რა განვითარ3ბაც არუნდა ქონდეს

Posted by: Otory 14 Nov 2016, 13:15
Svani91
CODE
app.locals

ან
CODE
res.locals

ჩვეულებრივი ობიექტებია და შეგიძლია მიდლვეარში (ან თვითონ რიქუესთში) ჩასვა რაც გინდა.
მაგალითად, გააკეთო setHeaderData მიდლვეარი, მასში წამოიღო საჭირო დატა და მერე app.locals.headerData = შენი დატა (ან თუ რამე კონკრეტულად რიქვესთს ეხება, მაგალითად იუზერის ინფო, სეტინგები, ლოქეილი - მაშინ res.locals.headerData = შენი დატა

მგონი ეგაა რაც გინდა.

ნუ კიდე, შეგიძლია იზვრაშენცობები აკეთო და ზოგადად req-ში შეინახო ობიექტად რასაც ატან და მერე res.render('template', req.myParamObject); smile.gif

Posted by: web_nts 14 Nov 2016, 15:50
X2D3T9
QUOTE
მოკლედ მაინტერესებს კონკრეტული ლინკები პოსტ გეთ და ფუთ მეთოდით გაგზავნილი მოთხოვნები დაბლოკოს სხვა ჰოსტიდან ....

სხვა ჰოსტიდან რას გულისხმობ? ანუ მაგალითად შენი საიტი არის http://example.com/ და ამ საიტზე თუ ვინმემ გადმოსცა პოსტ ან გეთ ცვლადები სხვა დომენიდან მაგალითად http://otherexample.com -იდან, დაბლოკოს ავტომატურად? თუ ასე მაშინ უნდა დაადგინო რეფერალის ჰედერი ექსპრესიდან
CODE
req.get('Referrer')
მაგრამ არ არის რეკომენდირებული უსაფრთხოებასთან დაკავშირებული გადაწყვეტილებების ჰედერზე დამოკიდებულება ვინაიდან ჰედერის შეცვლა შეიძლება მარტივად.

Svani91
QUOTE
არის 2 როუტი და ორივეს სჭირდება ჰედერ ქასთამ დეიტა და არ მინდა რო ესე ვამეორო კოდი, რამე სოლუშენი ხო არ გახსენდება?

თუ ხშირად იყენებ ერთი და იგივე ტექსტს ჰედერში, რატომ არ აინტეგრირებ ამ ტექსტის დეფოლტ ვერსიას თვითონ ტემპლეიტში?

CODE
<% if(typeof headerData !== 'undefined') { %>
   <%=headerData%>
<% } else { %>
   Default Header Text
<% } %>

ანუ თუ headerData არ გადაეცემა ტემპლეიტს, მაშინ დაწერს "Default Header Text" და თუ იშვიათად გჭირდება ამ ჰედერის შეცვლა მხოლოდ მაშინ გადასცემ headerData-ს და იმას დაგიწერს. თუ სწორად გავიგე რაც გინდოდა ესაა.

შენ შემთხვევაში Default Header Text-ის მაგივრად ჩაწერ იმას რასაც გადასცემდი dataFactory.headerData-თი და საერთოდ აღარ მოგიწერს გამეორება და ხსენება headerData-სი იმ როუტებში.

Posted by: Roofus 14 Nov 2016, 17:56
web_nts
ლარაველს აქვს მაგალითად csrf field და იქ არის ტოკენი და ამ ტოკენს ამოწმებს ყოველ POST რექუესტზე რომ კროს საიტ სკრიპტინგი არ იყოს შესაძლებელი. მსგავსი რამე აქვს ნოდს? smile.gif

Posted by: Ruritania 14 Nov 2016, 18:29
Roofus
express-ზე შეგიძლია კი. არის სხვადასხვა ბიბლიოთეკები. ჩვეულებრივი middleware-ის სახით კეთდება.
https://www.npmjs.com/package/csurf

Posted by: X2D3T9 14 Nov 2016, 20:47
web_nts

კი ეგ ვიგულისხმე ანუ სხვა დიმენზე არიმუშაოს ადრეც ვიკითხმე მგონი რაღაც მახსოვს drug.gif

https://github.com/expressjs/cors/blob/master/README.md

ეს ვნახე გავტესტავ მერე

Posted by: nv86 14 Nov 2016, 22:08
ჰოსტინგში ფული არ გადაიხადო არ გადამრიო.

googleსაც და amazonsსაც აქვს ორივეს ტრიალ პერიოდები.

3-თვიდან 12-მდე მგონი.

ასევე გამოიყენე nodejs-ის container-ები.

Posted by: web_nts 14 Nov 2016, 22:11
X2D3T9
QUOTE
კი ეგ ვიგულისხმე ანუ სხვა დიმენზე არიმუშაოს

CORS-ს თუ გულისხმობ, მაგისგან დასაცავად ცალკე არაფერი არ გჭირდება. გამორთულია ავტომატურად ყველა თანამედროვე ვებ სერვერზე და ბრაუზერში. შენ რაც დადე ეგ ლინკი პირიქით, სხვა დომენი რომ დაუშვა შენს საიტზე მაგისთვისაა.

ამასთანავე, CORS არ იცავს ფორმებიდან დაპოსტვისგან.... CORS არის მხოლოდ ajax რექვესთებისგან დასაცავი მექანიზმი.

აი მაგალით სად მუშაობს CORS და სად არა:

CODE
<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8">
       <meta name="viewport" content="width=device-width">
       <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
       <title>CORS TEST</title>
       <script>
           function load(){
               // ეს ფუნქცია დაიბლოკება ბრაუზერის მიერ ვინაიდან ფორუმს დაშვებული არ აქვს CORS მოთხოვნები
               $("#result").load( "https://forum.ge");
           }
       </script>
   </head>
   <body onload="load()">
       <!-- ეს ფორმა ჩვეულებრივად განახორციელებს POST რექვესთს ფორუმზე, ვინაიდან ბრაუზერების მიერ ეს დაშვებულია და ajax-ისგან განსხვავებით CORS შეზღვუდვა არ მოქმედებს ფორმებზე -->
       <form  action="https://forum.ge" method="post">
           <input type="text" name="user">
           <input type="password" name="password">
           <input type="submit" value="Submit">
       </form>
       <div id="result"></div>
   </body>
</html>

თუ ფორმების დაცვაც გინდა, მაშინ უნდა გამოიყოენო რაზეც Roofus და Ruritania საუბრობენ https://www.npmjs.com/package/csurf

nv86
QUOTE
googleსაც და amazonsსაც აქვს ორივეს ტრიალ პერიოდები.

3-თვიდან 12-მდე მგონი.

yes.gif ამაზონს 1 წლიანი აქვს მინიმალურ პაკეტებზე რომლებიც სრულიად გამოსადეგია სასწავლად yes.gif

QUOTE
ასევე გამოიყენე nodejs-ის container-ები.

no.gif ზოგადად კონტეინერების გამოყენება სადაო საკითხია, მაგრამ დამწყებებისთვის კონტეინერები მითუმეტეს მარაზმია.

Posted by: Svani91 14 Nov 2016, 22:32
მადლობა ყველას ხალხო, სახლში მივალ და ჩავუჯდები

» სპოილერის ნახვისთვის დააწკაპუნეთ აქ «

Posted by: nv86 15 Nov 2016, 01:40
QUOTE
no.gif ზოგადად კონტეინერების გამოყენება სადაო საკითხია, მაგრამ დამწყებებისთვის კონტეინერები მითუმეტეს მარაზმია.



დიდ სკეილზე რო ხარ როგორ წარმოგიდგენია ამაზონი ან გუგლი კონტეინრერების გარეშე. კაი რა.

და მაგისკენ მიდის.

პ.ს 1$ უნდა გქონდეს ბარათზე ოღონდ ორივეგან. გუგლზეც და ამაზონზეც. ჩამოგაჭრის და გიბრუნდება. უკანვე.

Posted by: Svani91 15 Nov 2016, 08:09
Otory

მგონი ეგ ვარიანტი ყველაზე მეტად მაწყობს, ვცდი და დავწერ რა გამომივა

web_nts

ეგრე რო გავა default - ო, კონტროლს ხო დავკარგავ? მე კი მინდა ვაცვლევინო ეგ. ალბათ არც შეიცვლება, მარა შესაძლებლობა მინდა იყოს

nv86

პროდაქშენზე გამომადგება ამაზონი? სასწავლად ერთია და პატარა პროდაქშენში ჩასაშვებ პროექტს ვწერ თან

მადლობა ყველას

პს
გამოვიდა კარგად

CODE

app.locals.headerData = dataFactory.headerData;
app.locals.footerData = dataFactory.footerData;


წიგნს ხო ვერ მირჩევდით რამეს?

Posted by: web_nts 15 Nov 2016, 10:14
nv86
QUOTE
დიდ სკეილზე რო ხარ როგორ წარმოგიდგენია ამაზონი ან გუგლი კონტეინრერების გარეშე. კაი რა

რამდენი წელია კონტეინერებზე ხარ? biggrin.gif მანამდე ინტერნეტი არ არსებობდა?

აბა მითხარი ეხლა ასეთი სიტუაცია.... მაქვს ნოდის ერთი აპლიკაცია რომელმაც იდეაში უნდა შეძლოს ულიმიტო ზრდა თუნდაც ფეისბუქის დონეზე. თითოეულ 8 ბირთბიან EC2 სერვერზე ეს აპლიკაცია არის გაშვებული 16 სხვადახვა პორტზე და შიდა load balancing-ს აკეთებს ამ პორტებზე Nginx. ეს 1 ცალი EC2 სერვერი თავისმხრივ ჩასმულია AWS Elastic Load Balancer-ში, რომელიც პროცესორის და რამის დატვირთვის მიხედვით ამ სერვერის სნაპშოტოს მიხედვით ქმნიან და ანადგურებენ ანალპგიურ ვირტუალირ მანქანებს. ეს არის Unlimited Scalability და არა კონტეინერები. ეხლა აღმოწერე რა მოგებას მომიტანს კონტეინერების ჩასმა ამ პროცესში როდესაც პროდუქციისთვის მზა აპლიკაციას ვუშვებ? იმედია იმას ხვდები რომ კონტეინერები უფრო მეტ რესურს წაიღებს ხო? ანუ დაახლოებით 5 წუთს რომ იგებ კონტეინერების შექმნით ვირტუალირი სერვერის სნაპშოტთან შედარებით, ამიტომ ღირს რესურსის გაწირვა?

კონტეინერები არის კარგი დაჩქარებული ისეთ სიტუაციაში სადაც იუზერს ფართო წვდომა აქვს სისტემაზე და კონტეინერებს იყენებ სენდბოქსად. ისიც ბოლო უსაფრთხოების პრობლემების გამო ეჭვქვეშაა რამდენიმად მუშაობს http://www.theregister.co.uk/2016/11/01/docker_user_havent_patched_dirty_cow_yet_bad_news/
* * *
Svani91
QUOTE
ეგრე რო გავა default - ო, კონტროლს ხო დავკარგავ? მე კი მინდა ვაცვლევინო ეგ. ალბათ არც შეიცვლება, მარა შესაძლებლობა მინდა იყოს

კოდი რაც დავდე არ ნახე? პირიქით, საქმეს იმარტოვებ. დეფოლტი არის დაყენებული და ყოველ ჯერზე მისი შეცვლა არ გჭირდება, მაგრამ თუ გჭირდება ან ოდესმე დაგჭირდება შეცვლა გადასცემ მოდიფიცირებულ ჰედერს და გამოიტანს ამ მოდიფიკაციას.

კარგად დააკვირდი აბა კოდს
CODE
<% if(typeof headerData !== 'undefined') { %>
  <%=headerData%>
<% } else { %>
  Default Header Text
<% } %>


და მიუხედავად დიდი პატივიაცემისა ამხანაგი ოთარის მიმართ, ნოდში გლობალების გამოყენება მხოლოდ უკიდურეს შემთხვევაში მიმაჩნია მიზანშეწონილად smile.gif და შენი შემთხვება მიახლოებილიც კი არ არის რამე უკიდურესობასთან. ვერცერთ სერიოზულ პროექტს ვერ ნახავ გაგლობალებული თემის ნაწილებით. მითუმეტეს app-ში დამატებილი გლობალებით. არსებობს გლობალური ობიექტი global რომელშიც უნდა დაამატო შენი ობიექტი რომელსაც ერქმევა უნიკალური სახელი რათა აიცილო თავდიან რამე პოტენციური კონფლიქტი და იქ ჩაწერ ყველაფერს.

CODE
global.myUniqueAppName = { config: { url: '....' } };

global.myUniqueAppName.theme = { header: '........' };

მაგრამ კიდევ ერთხელ, გლობალის მსგავსი გამოყენება ითვლება ცუდ პრაქტიკად.

Posted by: Svani91 15 Nov 2016, 11:18
web_nts

ეს default text სადმე უნდა შევინახო, ყველა ვარიანტში. ალბათ ვერ ვკითხულობ სწორად.

თუ გლობალში ან ლოკალში არა, აბა სად? ყოველ ჯერზე გადმოცემა არ მინდა ძალიან

აი წარმოიდგინე ლეიაუთ ფაილი, რომელიც ყველა გვერდს დაყვება და არაა სტატიკი. რას აკეთებ ამ დროს

Posted by: web_nts 15 Nov 2016, 11:51
Svani91
თემის ფაილს არ იყენებ? ყველაფერი სტრინგად უნდა ჩასვა კაცო? smile.gif

მოგვიანებით დავწერ ejs-ზეც და mustache-ზეც თუ როგორ შექმნა ფაილები და როგორ გაუკეთო ინტეგრაცია მოდულად ამ ყველაფერს ყველანაირი გლობალების გარეშე smile.gif

Posted by: Otory 15 Nov 2016, 18:16
web_nts
გლობალი არ არის, სკოუპ ვერიეიბლია...
მიდლვეარებიდან res / req -ის გარეშე როგორ მოგაქვს დატა? თუნდაც ავტორიზაციის დატა.

ამ კონკრეტულ შემთხვევას რაც შეეხება, მე უფრო breadcrumbs ვარიანტი მგონია და შესაბამისად დიფოლტ ტექსტი არ წავა. მე რა ვარიანტიც დავწერე - ფაქტიურად ეგაა მაგ შემთხვევისთვის.

Posted by: Svani91 15 Nov 2016, 21:54
Otory

QUOTE
breadcrumbs ვარიანტი მგონია


არა, მაგრამ დაახლოებით მსგავსი ვარიანტია

აი დავუშვათ ვწერ .net mvc - ში
მაქვს რამე _Layout ფაილი და იმას ვანიჭებ ექშენებს თუ მინდა ან ვანულებ, აღარ დავწერ ბევრს

დაახლოებით მსგავსი მინდოდა ყოფილიყო ეს ჩემი header ფაილი

დავდებ სქრინს

Posted by: web_nts 15 Nov 2016, 21:55
Otory
ნუ იდეაში გლობალური გამოდის მაინც ამ აპლიკაციისთვის smile.gif res/req არ გამოუყენებია, app გამოიყენა რაც ზემოთ დაწერა და რომელიც res/req-ისგან განსხვავებით არ ნადგურდება შესრულებიშ შემდეგ. თან მე რასაც ვხდები ამას უნდა რომ სტრინგებში ქონდეს თემის ნაწილები და ყოველი მოთხოვნისას ააწყოს ხოლმე და ამიტომ მგონია რომ გლობალად განსაზღვრა უნდა. შეიძლება სხვანაირად ვიგებთ ორივე და საერთოდ სხვა რამე უნდა biggrin.gif

Svani91
მოკლედ პატარა აპლიკაცია გავაკეთე ტემპლეიტები რომ ნახო იდეაში როგორ მუშაობს ejs-ზეც და mustache-ზეც.

გადმოწერე მიმაგრებული ზიპ ფაილი
ჩააგდე ნებისმიერ ფოლდერში გინდ ვინდოუსზე და გინდ ლინუქსზე სადაც ნოდი გიყენია
გაუშვი კონსოლში npm install
შემდეგ გაუშვი აპლიკაცია npm start
გახსენი ეს ლინკი http://localhost:3000/ejsPage1 და მიყევი სხვა ლინკებს რომელიც მაგ გვერდზეა

ეხლა დაერიე ფაილებს და გაარჩიე აპლიკაცია რას აკეთებს smile.gif ოღონდ კარგად გაარჩიე ტყულად არ მაწვალო sa.gif

მოკლე აღწერა ასეთია:
ფოლდერში themes-ში რასაც ჩააგდებ და რამდენ ფაილსაც ჩააგდებ რომლებთაც აქვს გაფართოება .ejs ან .mustache , აპლიკაცია ყველა ამ ფაილს ჩატვირთავს მეხსიერებაში გაშვებისთანავე და შემდეგ მოთხოვნებს აქედან დააგენერირებს. თემების რენდერის ფუნქცია არის ჩასმული მოდულად რომელსაც ტვირთავს მთავარი ფაილი
CODE
var template = require('./templatetest.js');

და მოთხოვნებს აკეთებს შემდეგნაირად:
CODE
//template(engine, name, data);
// engine არის ტემპლეიტის ძრავის სახელი ejs ან mustache
// name არის themes ფოლდერში განთავსებული ფაილის სახელი გაფართოების გარეშე (main.ejs თუ ქვია ფაილს ვაგზავნით მხოლოდ main-ს)
// data არის პარამეტრები რომელიც გადაეცემა ტემპლეიტებს ობიექტის სახით

res.send(template('ejs', 'main', data));

იმედია გამოგადგება smile.gif

Posted by: Svani91 15 Nov 2016, 22:00
web_nts

ხვალ დილით დაგახვედრებ პასუხს up.gif

მადლობ

Posted by: mikey:) 15 Nov 2016, 22:30
Express ჯობია თუ Sails? ......

Posted by: web_nts 15 Nov 2016, 22:42
mikey:)
QUOTE
Express ჯობია თუ Sails? ......

რა თმა უნდა ექსპრესი.

Sails ექსპრესზე დგას თვითონ და იმის მეათედი დოკუმენტაცია და რესურსი არ არსებობს რაც ექსპრესს აქვს.

Posted by: Otory 15 Nov 2016, 23:55
web_nts
Svani91
მოკლედ სიტუაცია ასეთია:
* თუ რაღაც განმეორებითი სტატიკური კონტენტია ტემპლეიტში, მაშინ ჯობია საბტემპლეიტი გააკეთო და ის დააინკლუდო უბრალოდ, კოდში ვაბშე არაფერი გექნება - გექნება მხოლოდ ტემპლეიტში (მგონი ეს არის შენი შემთხვევა);
* თუ რაღაც განმეორებითი დინამიური კონტენტია (მაგალითად დალოგინებული იუზერის სახელი, breadcrumbs, ან რაიმე მსგავსი) - მაშინ სასურველია რომ მიდლვეარი გამოიყენო მისი გენერირებისთვის (ეს ალბათ ისედაც ასე იქნება) და res.locals გამოიყენო;
* თუ რაღაც განმეორებითი დინამიური კონტენტია მაგრამ რატომღაც (?? არ წარმომიდგენია რა შემთხვევა შეიძლება იყოს, really...) მიდლვეარში ვერ ჩასვამ მის გენერირება / პროცესინგს - მაშინ app.locals შეგიძლია გამოიყენო. დედამიწა არ ჩამოიქცევა და ქართველობას არავინ წაგვართმევს გლობალები (ნუ, მეტ-ნაკლებად) გამოვიყენოთ, ასევე სქოუფის პრობლემა არ იქნება, რადგან მთლად გლობალი არაა - "ლოკალური გლობალია", მაგრამ (!) ცუდი (99%) არქიტექტურის მაჩვენებელია. შეიძლება არის რამე გამონაკლისი სადაც ნაღდად საჭიროა, მაგრამ არაფერი არ მაფიქრდება ახლა...

ვოტ ტაკ )))

Posted by: Svani91 16 Nov 2016, 00:53
web_nts

CODE

if (templates[engine]) {
       if (templates[engine][name]) {
           if (engine === 'ejs') {
               response = ejs.render(templates[engine][name], data);
           } else if (engine === 'mustache') {
               response = mustache.render(templates[engine][name], data);
           }
       }
   }


ეს template layer გასაგებია და მომეწონა, მაგას გამოვიყენებ აწი. ვიუ ენჯინის ვარიაცია ან საერთოდ შეცვლა რო დაგჭირდეს, მარტივად მოხდება წესით. რატო უნდა დამჭირდეს არ ვიცი მარა მაინც

მე მინდოდა რო ყოველ როუტში, ესე არ გამეორებულიყო headerData

CODE

var data = {
       title: 'ejsCustom',
       headerData: 'Custom Header Text!!!',
       ejsPage1: {
           content: 'Random content for ejsCustomHeader'
       }
   };


ისე კი, საჭიროა ყველა როუტში - ანუ ის სიტუაცია არაა რო ზოგან იყოს და ზოგან არა
ყველგან უნდა იყოს და სტატიკური არ უნდა იყოს ამავე დროს
და ეს Otory - ს სოლუშენმა გადაწყვიტა
აღარ ვატან არცერთ როუტში და მაქვს წვდომა პირდაპირ, template - ში

ასევე, mustache - ს ეხლა გადავხედე და დავიბენი, ორივე მომწონს smile.gif)

პს

ჩემსავით დამწყებებს, pluralsight - ის 3 თვიანი საბსქრიბშენის დათრევა არის ძალიან ადვილი MS Developer ექაუნთით და გაითვალისწინეთ wink.gif

Posted by: web_nts 16 Nov 2016, 02:01
Svani91
QUOTE
ისე კი, საჭიროა ყველა როუტში - ანუ ის სიტუაცია არაა რო ზოგან იყოს და ზოგან არა
ყველგან უნდა იყოს და სტატიკური არ უნდა იყოს ამავე დროს

შეგიძლია მარტივი HTML მაგალითი დადო? აი რამე ისეთი როგორც ჩემს დადებულ ფაილშია და კონკრეტულად გვაჩვენო ჰედერში რას გულისხმობ smile.gif ვერ მივხვდი user.gif

ejs და mustache კი ორივე ერთად იმიტომ მაქვს რომ უბრალოდ ორივეზე შეგქმნოდა წარმოდგენა და შენთვითონვე რომ შეძლო მომავალში მსგავსი მოდულების შექმნა. საბოლოო ვერსიიდან რომელიც გინდა მარტო ის უნდა დატოვო და იმის მიხედვით დახვეწო ის მოდული. ეს უბრალოდ 20 წუთში დაწერილი მარტივი მაგალითი იყო მთლიანი აპლიკაცია smile.gif

Otory
გეთანხმები თითქმის ყველაფერში smile.gif app.local-ის ნაცვლად მოდულს შევქნიდი მე პირადად და რომელ ფაილშიც დამჭირდებოდა იმაში დავაინქლუდებდი user.gif

აი მაგალითად გვაქვს მარტივი კონფიგი სადაც ვინახავთ რაღაც API იუზერს და გასაღებს.

შენი სოლუშენია რომ შეინახო ასე:
CODE
app.locals.config = { user: 'admini55', key: 'u6Fsjs7Tvev' };

მე შევქმნიდი ფაილს config.js და გავაკეთებდი მოდულს
CODE
module.exports = { user: 'admini55', key: 'u6Fsjs7Tvev' };

და ყველა საჭირო ფაილში დავაინქლუდებდი ამ კონფიგს
CODE
var api = require('./config');

მიჩვევის ამბავია თორემ თეორიულად არც app.locals დაღუპავს პროექტს და არც global თუ ფრთხილად იქნები. უბრალოდ ოდითგანვე თავში მაქვს გამჯდარი რომ გლობალები "ცუდია" და ყოველთვის ვცდილობ შორიდან მოვუარო smile.gif

Posted by: Svani91 16 Nov 2016, 02:05
web_nts

აი ეს ფრაგმენტი არის ყველა გვერდისთვის ერთი. მაგრამ შეიცავს ისეთ მონაცემებს, რომელიც რამე სორსიდან უნდა წამოვიდეს

CODE

       <div class="container-fluid top-container">
           <div class="row">
               <div class="container">
                   <div class="row">
                       <div class="social pull-left">
                           <a href="#"> <i class="fa fa-facebook" aria-hidden="true"></i></a>
                       </div>
                       <div class="top-phone pull-right">
                           <i class="fa fa-phone" aria-hidden="true"></i><span>{{custom_data1}}</span>
                       </div>
                       <div class="top-adress pull-right">
                           <i class="fa fa-building" aria-hidden="true"></i><span>{{custom_data2}}</span>
                       </div>
                   </div>
               </div>
           </div>
       </div>


custom_data1 და custom_data2

Posted by: X2D3T9 16 Nov 2016, 02:20
თემპლეით ენჯინათ hbs ს არ იყენებთ ექსპრესზე ? რავი მე მოსახერხებელი მეჩვენა .... ვაფშემ jade და მისი ჯანი smile.gif

Posted by: pixel4ever 16 Nov 2016, 03:33
EJS მირჩევნია მე პირადად, ჯავასკრიპტია ფაქტიურად და უფრო ქომფორტულია. Jade-ის ხმარება დავიწყე თავიდან მაგრამ ვერანაირად ვერ შევეჩვიე სინტაქსს.

Posted by: Svani91 16 Nov 2016, 10:00
X2D3T9

Angular ს ვიყენებ მე და კონფლიქტი ექნება hbs ს სინტაქსთან თორე ძაან კარგი ჩანს ეგეც

Posted by: Otory 16 Nov 2016, 14:29
web_nts
რა თქმა უნდა, სადაც მოდულად გატანა შეიძლება - მოდულად უნდა გაიტანო, მაგრამ app.locals იმას უზრუნველყოფს რომ ტემპლეიტში გადაეცემა ყოველთვის, და
CODE
var api = require('./config');
ეს ხომ მაგას ვერ წყვეტს...

Posted by: X2D3T9 16 Nov 2016, 19:55
სერვერი რომ არ დაეკიდოს რამე ჩეპეს შემთხვევაში და გადაუტვირთავად ჩაასწორო კოდი რომელი ბიბლიოთეკაა სანდო?

Posted by: Svani91 16 Nov 2016, 22:08
კარგი კურსი ვიპოვე და მივყვები

https://app.pluralsight.com/library/courses/nodejs-express-web-applications/table-of-contents

ესე 2 კვირაში თუ შემაყვარებდა თავს, არ მეგონა biggrin.gif
* * *
X2D3T9

სერვერის დაკიდებაში რას გულისხმობ, ზუსტად ვერ მივხვდი, მაგრამ გადაუტვირთავად ჩასწორება მგონი ესაა

https://www.npmjs.com/package/nodemon

სტარტი იქნება node - ს მაგივრად nodemon app.js

თუმცა არ ვიცი ეს პროდაქშენზე რამდენად სწორია

Posted by: web_nts 16 Nov 2016, 22:53
X2D3T9
QUOTE
სერვერი რომ არ დაეკიდოს რამე ჩეპეს შემთხვევაში და გადაუტვირთავად ჩაასწორო კოდი რომელი ბიბლიოთეკაა სანდო?

Svani91
QUOTE
https://www.npmjs.com/package/nodemon

yes.gif
ოღონს ეს მარტო დეველოპმენტის დროს, ხელით რომ არ მოგიწიოს რესტარტი ყოველ ცვლილებაზე.

QUOTE
თუმცა არ ვიცი ეს პროდაქშენზე რამდენად სწორია

პროდაქშენის დროს ნოდემონი შეგიძლია გამოიყენო მაგრამ გაშვებულ საიტზე რომელზეც კლიენტს წვდომა აქვს არ არის კარგი იდეა. რედაქტირება უნდა ხდებოდეს სატესტო სერვერზე და მერე ეშვებოდეს კლიენტისთვის.

პროდაქშენზე უნდა გამოიყენო https://www.npmjs.com/package/forever რომელიც უზრუნველყოფს რომ აპლიკაცია სულ მუშაობდეს, ანუ რამე ფატალური შეცდომა თუ მოხდა ან რამე მიზეზის გამო დაეკიდა აპლიკაცია, ავტომატურად დაარესტარტებს.

forever start app.js

რა თქმა უნდა ხელით რომ არ გიწევდეს ამის გაშვება, ეს ყველაფერი უნდა ჩაჯდეს ლინუქსის სერვისად სტარტაპში. ხვალ დავწერ ცენტოსზე როგორ დავამატოთ ნოდის აპლიკაცია სერვისად, მარტო ნოდითაც და ფორევერითაც.

Posted by: Roofus 17 Nov 2016, 00:44
web_nts
წიგნში ეწერა ფუნქცია spawn რომელსაც შეუძლია გაუშვას executable დამოუკიდებლად თავისი არგუმენტებიანად... და stdin stdout სტრიმი აქვსო...
მოკლედ ამ spawn-ის გამოყენება შეიძლებაო მონიტორინგისთვის.
ანუ ერთი node აპლიკაციიდან მეორის კონტროლი , ამ შემთხვევაში სერვერის.
რესტარტი თუ დაუშვათ ბევრ მეხსიერებას მოიხმარს ან რაიმე კრიტიკული შეცდომაა...

მეორე აპროაჩი იყო შელ სკრიპტის დაწერა.

ხო კიდევ აქ nginx ტუტორიალში გიწერია რამოდენიმე სერვერი და წიგნში იგივე მიზნისთვის http_proxy გამოიყენება.
ანუ ეს პროქსი აკეთებს round robin-ს სერვერებზე... და მთავარი პრობლემა არის სესია.
ანუ დაუშვათ სერვერ 1-ზე გაშვებული სესია სერვერ 2-მა არ იცის...
ამის მოსაგვარებლად კიდევ memcached მოდულს იყენებენ...

პრინციპში არ მესმის ngnix-ის გამოყენების აზრი თუ http_proxy + memcached შეიძლება გაკეთება. (+იგივე ვირტუალ ჰოსტების http_proxy-თ შეიძLება)

ეს 1 წიგნი მოვრჩი... "Learning Node.js A Hands-on Guide to Building Web Applications in java[ertad]script (Marc Wandschneider)" ყველა ნუბს ურჩევ...
ეხლა დამრჩა Practical Node.js და Professional Node.js biggrin.gif

up.gif

Posted by: web_nts 17 Nov 2016, 02:14
QUOTE
http_proxy

http_proxy ვებ სერვერი არ არის, Nginx-ს პროქსის ფუნქციის გარდა უამრავი პლიუსი აქვს. ჰედერების, დომენების და სუბდომენების მართვა, მოთხოვნების რაოდენობის და ზომების ლიმიტირება, სტატიკურ ფაილებთან მუშაობა, უმარტივი SSL კონფიგურაცია და ასე შემდეგ. პროდუქციაში ჩაშვებულ აპლიაკაციაში კლიენტს პირველი უნდა შეხვდეს ვებ სერვერი რომელიც შემდეგ გადაანაწილებს მოთხოვნებს, უზრუნველყოფს SSL-ს და შემდეგ რა პორტზე და სერვერზეც გინდა გადაამისამარათებს smile.gif პატარა დატვირთვაზე თვითონ ნოდიც გაქაჩავს ვებ სერვერად, მაგრამ რაც უფრო იზრდება მოთხოვნა მით უფრო აცნობიერებ გამოცდილი ვებ სერვერის უპირატესობას.

ზოგადად პროქსირება, ლოად ბალანსიც და SSL-ი, პირდაპირ ნოდიდანაც შეიძლება. მეოთხმოცე პორტზე ადმინისტრატორის პრივილეგიიანი ექაუნთით გაუშვებ ერთ აპლიკაციას რომელიც შემდეგ ასინქრონული http მოთხოვნებით გადაანაწილებს სხვადასხვა პორტებზე არსებულ ნოდის აპლიკაციებზე მოთხოვნებს... მაგრამ რატომ? smile.gif ვერასოდეს ვერ მიაღწევ Nginx-ის ან Apache-ს დონის რენტაბელურობას (ფუნქციონალურობაზე რომ არაფერი ვთქვათ).

სესიებს რაც შეეხება, საერთოდ არ არის საჭირო. თუ აპლიკაცია სესიებზეა დამოკიდებული, ვერასდორს ვერ მიაღწევს ულიმიტო ზრდის შესაძლებლობას. როდესაც სერვერების რაოდენობის ავტომატიზირებულ ზრდაზე და შემცირებაზეა საუბარი, მარტო ნოდის სესიებია პრობლემა? smile.gif AES256-ით რამოდენიმეჯერ დაკრიპტული cookies + ბრაუზერის სესიები (ოღონდ არა PHP-ს გაგებით სერვერზე ფიზიკურად შენახული სესიები).. ნოდის crypto მოდულით AWS-ის ყველაზე სუსტი სერვერით, კლიენტის ნებისმირი საჭირო ინფოს 10-ჯერ დაკრიპტვას (თითოეულ ჯერზე უნიკალური რენდომ სტრინგის ინექციით) და მერე მის უკან აღდგენას ჭირდება ზუსტად 1 მილიწამი. რა საჭიროა სტანდარტული გაგებით სესია როდესაც ასეთი რამე შეგიძლია და ასე სწრაფად?

Posted by: Roofus 17 Nov 2016, 03:12
web_nts
ქუქიების და ცვლადების გაგებით ვთქვი სესია...
ანუ ერთ სესიაში თუ იუზერი დალოგინდა მეორე სერვერზე ეგ არ აისახება ანუ... ვერ... თუ როგორცაა gigi.gif

ესეიგი nginx war.gif გასაგებია.

Posted by: web_nts 17 Nov 2016, 13:08
Power of Node.js smile.gif

https://samy.pl/poisontap/


Posted by: X2D3T9 17 Nov 2016, 15:09
web_nts

რა მაინტერესებ იცი აქ რომ გიწერია https://forum.ge/?showtopic=34905806&view=findpost&p=49263142 კონფიგურაცია პორტებზე
ეხლა ვაწყობ ვირტუალზე
შესაძლებელია მაგ პორტებზე მაგალთად სხვა დომენები მიაბა ან თუნდა სუბდომენები ? პინგვინებში მინდოდა მეკითხა და ბარემ აქ ვიკითხავ


არაფრის დიდებით არ წერს ნოდარას მაგ მეთოდითაც ვცადე და wget ით თვითნ ფაილის გადმოწერეა მარა შუაზე გაირღვა არ უკავშირდება ფაივოლი გათიშული იპთეიბლებიც გავთიშე მიშველეთ რამე

Posted by: web_nts 17 Nov 2016, 16:34
X2D3T9
QUOTE
შესაძლებელია მაგ პორტებზე მაგალთად სხვა დომენები მიაბა ან თუნდა სუბდომენები ? პინგვინებში მინდოდა მეკითხა და ბარემ აქ ვიკითხავ

კი შეიძლება ძალიან მარტივად, დავწერ ცოტა ხანში.

QUOTE
არაფრის დიდებით არ წერს ნოდარას მაგ მეთოდითაც

Centos 7-ზე ვერ აყენებ ამ მეთოდით? spy.gif რას გიწერს შეცდომას ან სად იჭედები დააკოპირე აბა. თუ დააყენე და ვერ უკავშირდები პორტს? node --version ჩაწერე აბა კონსოლში რას წერს.

Posted by: X2D3T9 17 Nov 2016, 16:39
web_nts

ფაირვოლის ბრალი ყოფილა 80 პორტი დავამატე იპტეიბლებში და არ ვასეივებდი თურმე givi.gif ეხლა გაიშვა

Posted by: web_nts 17 Nov 2016, 17:06
X2D3T9
up.gif

იგივე პორტებზე სხვა დომენების/საბ დომენების მიბმას რაც შეეხება, სამნაირად შეგიძლია გააკეთო:

1.ყველაზე მარტივად იგივე კონფიგში უბრალოდ სერვერის სახელებში დაამატო ახალი დომენი ან საბდომენი:
CODE
upstream mynodeapp {
  server localhost:3000;
  keepalive 64;
}

server {
  listen 80;
  # აქ ვამატებთ რამდენი დომენი, საბდომენი ან IP მისამართიც გვინდა
  server_name mydomain.com www.mydomain.com myotherdomain.ge www.myotherdomain.ge sub555.myotherdomain.ge 192.168.1.111;
 
  location ~ ^/(img/files/|static/|robots.txt|favicon.ico) {
      root /home/puser/myapp/static;
      access_log off;
      expires max;
  }

  location / {
      proxy_redirect off;
 
      proxy_set_header X-Real-IP         $remote_addr;
      proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host              $http_host;
      proxy_set_header X-NginX-Proxy     true;
      proxy_set_header Connection        "";

      proxy_http_version     1.1;
      proxy_buffering        off;
      proxy_intercept_errors on;

      proxy_pass http://mynodeapp;
  }
}

2. მეორე სერვერის კონფიგი გააკეთო სხვა დომენებისთვის (სერვერების რაოდენობაში ლიმიტირებული არ ხარ) და იგივე ნოდის upstream-ზე დალინკო:
CODE
# ვიყენებთ ისევ ამ ერთ upstream-ს ორ სხვადასხვა სერვერის კონფიგში
upstream mynodeapp {
  server localhost:3000;
  keepalive 64;
}

server {
  listen 80;
  # აქ ვწერთ მარტო მთავარ დომენს და მის www ვერსიას
  server_name mydomain.com www.mydomain.com;
 
  location ~ ^/(img/files/|static/|robots.txt|favicon.ico) {
      root /home/puser/myapp/static;
      access_log off;
      expires max;
  }

  location / {
      proxy_redirect off;
 
      proxy_set_header X-Real-IP         $remote_addr;
      proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host              $http_host;
      proxy_set_header X-NginX-Proxy     true;
      proxy_set_header Connection        "";

      proxy_http_version     1.1;
      proxy_buffering        off;
      proxy_intercept_errors on;

      proxy_pass http://mynodeapp;
  }
}
# ვამატებთ ახალ სერვერია კონფიგს სადაც დავამატებთ სხვა დომენს/საბდომენს

server {
  listen 80;
  # აქ ვწერთ ახალ/სხვა დომენს და საბდომენს
  server_name myotherdomain.ge www.myotherdomain.ge sub555.myotherdomain.ge;
 
  location ~ ^/(img/files/|static/|robots.txt|favicon.ico) {
      root /home/puser/myapp/static;
      access_log off;
      expires max;
  }

  location / {
      proxy_redirect off;
 
      proxy_set_header X-Real-IP         $remote_addr;
      proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host              $http_host;
      proxy_set_header X-NginX-Proxy     true;
      proxy_set_header Connection        "";

      proxy_http_version     1.1;
      proxy_buffering        off;
      proxy_intercept_errors on;

      proxy_pass http://mynodeapp;
  }
}

3. ვაკეთებთ იგივეს რასაც ზემოთ, მაგრამ სერვერის გარდა ვამატებთ იგივე upstream-ს ოღონდ სხვა სახელით რომელსაც გამოვიყენებთ მეორე სერვერში:
CODE
upstream mynodeapp {
  server localhost:3000;
  keepalive 64;
}

# ვამატებთ ახალ upstream-ს რომელსაც გამოვიყენებთ მეორე სერვერის კონფიგში
upstream myotherdomain {
  server localhost:3000;
  keepalive 64;
}

server {
  listen 80;
  # აქ ვწერთ მარტო მთავარ დომენს და მის www ვერსიას
  server_name mydomain.com www.mydomain.com;
 
  location ~ ^/(img/files/|static/|robots.txt|favicon.ico) {
      root /home/puser/myapp/static;
      access_log off;
      expires max;
  }

  location / {
      proxy_redirect off;
 
      proxy_set_header X-Real-IP         $remote_addr;
      proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host              $http_host;
      proxy_set_header X-NginX-Proxy     true;
      proxy_set_header Connection        "";

      proxy_http_version     1.1;
      proxy_buffering        off;
      proxy_intercept_errors on;

      proxy_pass http://mynodeapp;
  }
}

# ვამატებთ ახალ სერვერია კონფიგს სადაც დავამატებთ სხვა დომენს/საბდომენს

server {
  listen 80;
  # აქ ვწერთ ახალ/სხვა დომენს და საბდომენს
  server_name myotherdomain.ge www.myotherdomain.ge sub555.myotherdomain.ge;
 
  location ~ ^/(img/files/|static/|robots.txt|favicon.ico) {
      root /home/puser/myapp/static;
      access_log off;
      expires max;
  }

  location / {
      proxy_redirect off;
 
      proxy_set_header X-Real-IP         $remote_addr;
      proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host              $http_host;
      proxy_set_header X-NginX-Proxy     true;
      proxy_set_header Connection        "";

      proxy_http_version     1.1;
      proxy_buffering        off;
      proxy_intercept_errors on;

      # ვლინკავთ ახალ upstream-თან
      proxy_pass http://myotherdomain;
  }
}

მოკლედ, კარგი რამეა Nginx smile.gif უამრავი ხერხი არსებობს ერთი პრობლემის გადასაჭრელად... რომელიც უფრო მოხერხებულია იმას აირჩევ.

Posted by: X2D3T9 17 Nov 2016, 20:40
გამაცოფა მივაგდე givi.gif იმენა შეჯდა ჯორზე არ ეშვებეა არ ვიცი ყველაფერი ასე გავაკეთე რა მაგალითებს არ გადავხედე მარა არ ეშვება.... curl http://chemiaipi იძლეოდა ბედ გეითვეის .... კონფიგს ვერ ვაკეთებ ნორმალურათ დაწყნარებულზე მივხედავ მერე

Posted by: web_nts 17 Nov 2016, 23:47
X2D3T9
QUOTE
იძლეოდა ბედ გეითვეის .... კონფიგს ვერ ვაკეთებ ნორმალურათ დაწყნარებულზე მივხედავ მერე

უცნაურად კი შეიძლება მოგეჩვენოს ეა კითხვა, მაგრამ აპლიკაცია გაშვებული გაქვს ნოდის მაგ დროს როდესაც მოთხოვნას აკეთებ? smile.gif 503 bad gateway მოდის მაშინ როდეააც აპლიკაცია ჩართული არ არის და ngimx პროქსის ვერ ნახულობს.

Posted by: X2D3T9 18 Nov 2016, 01:57
web_nts

კი რა თქმა უნდა smile.gif
რაღაცას nginx ში ვერ ვშვები კარგათ ხვალ ჩავუჯდები კიდე და დავწერ თუ რამე ისე არწავიდა.... ამერდამერია ყველაფერი რაღაც იპტეიბლები დავაყენს კიდე ათასი სისულელე დამავიწყდა სად რა გავაკეთე smile.gif

Posted by: web_nts 18 Nov 2016, 13:40
X2D3T9
დადე მთლიანი კონფიგი აბა და ვნახავთ სადაა შეცდომა.

ნოდის პორტზე მუშაობს აპლიკაცია? ანუ http://chemiip:3000 -ზე და Nginx შეცდომას გიგდებს?

Posted by: X2D3T9 18 Nov 2016, 14:01
web_nts

კი ეგრე შვებოდა ცენტოსზე ეხლა უბუნტუს ვიყენებ დესკტოპად და იქ გავუშვი თავისუფლად smile.gif კონფიგები დიდათ არ განსხვავდება არ უნდა გამიჭირდეს მორგება ვნახოთ...

Posted by: web_nts 18 Nov 2016, 14:58
X2D3T9
ხო დეკსტოპად თუ გაქვს უბუნტუ, ცენტოსის ვირტუალურად გაშვებას აზრი არ აქვს. Nginx ის კონფიგი იგივეა ნებისმიერ ლინუქსზე.

Posted by: Svani91 18 Nov 2016, 22:53
web_nts

ცენტოს 6 ზე რამე სხვა კონფიგები ხო არ უნდა?

ძლივს დამიყენეს ვპს და სანამ ეგენი შეცვლიან


Posted by: web_nts 18 Nov 2016, 23:04
Svani91
QUOTE
ცენტოს 6 ზე რამე სხვა კონფიგები ხო არ უნდა?

წესით არაფერი სხვაობა არ არის no.gif თუ სადმე გაიჭედე დასქრინე smile.gif

Posted by: pixel4ever 19 Nov 2016, 01:40
Hapi.js ხო არ იყენებთ ვინმე, მითხრეს რომ უფრო დაცულია ვიდრე Express და უკეთესიაო მოკლედ და მაინტერესებს რამდენად სიმართლეს შეესაბამება. Express ვხმარობ მე და ჯერ ჯერობით ძალიან კმაყოფილი ვარ smile.gif

Posted by: Roofus 19 Nov 2016, 03:52
pixel4ever
api სერვერისთვისაა ეგ hapi smile.gif
უფრო მარტივად / სწრაფად აკეთებ ამგით ვიდრე ექსპრესითო...

წიგნშია ეგრე user.gif პრაქტიკაზე ჯერ არ გადავსულვარ user.gif

ცოტახანში biggrin.gif
* * *
მულტისრეადინგისთვის კლასტერზე რას იტყვით?
http://nodejs.org/api/cluster.html
ეს საერთოდ Ebay-ს გაუკეთებია

https://github.com/cubejs/cluster2

funfact Hapi wallmart labs-ის გაკეთებულია.

Posted by: X2D3T9 19 Nov 2016, 13:16
ერორ ჰენდლერებზე რას იყტვით ვისაც გამოცდილება გაქვთ იქნება ორი სიტყვით დაწეროთ.... მაგალითად მინდა ეხლა დავწერი რამე ფუნქცია ბაზიდან (მანგუსს ვიყენებ) ინფოს წამოღების,ჩაწერის,წაშლის ერორები საჭირო ფორმით გამოვიტანო პროდაქშენზე.... როუტებზე გასაგებია გავიასნდი.... დიდი მნიშვნელობა აქვს ალბათ დამეთანხმებით ერორების სწორად გამართვას.... რამ პატარამაგალითი რომ მაჩვენოთ როგორ მივაწოდო კლიენტს მაგალითად 404 , 500, ერორი ჯეისონ ფორმატში.... ანუ სერვერისგან კლიენტმა უნდა მიიღოს მაგალითად სოკეტ აიოთი

Posted by: web_nts 19 Nov 2016, 14:50
X2D3T9
QUOTE
რამ პატარამაგალითი რომ მაჩვენოთ როგორ მივაწოდო კლიენტს მაგალითად 404 , 500, ერორი ჯეისონ ფორმატში.... ანუ სერვერისგან კლიენტმა უნდა მიიღოს მაგალითად სოკეტ აიოთი

HTTP Error ჰედერი რომ დააბრუნოს ეს გინდა თუ სოკეტს რომ გადასცე რომ რაღაც შეცდომა დაფიქსირდა? 50x ერორს როგორც წესი აპლილაცია არ ეგენერირებს. 50x ერორებს აგენერირებს ვებსერვერი როდესაც აპლიკაცია მიუწვდომელია. 404 ერორი (ფაილი ვერ მოიძებნა) სოკეტში რაში გჭირდება? ფაილს აწვდი სოკეტით? (სოკეტებზე იმიტომ გეკითხები რომ სოკეტ.იო ახსენე).

თუ HTTP ერორებს გულისხმობ, მაშინ სტატუსად უნდა დააყენო შეცდომის კოდი:
CODE
res.status(404);
res.send("404 Not found.");

CODE
res.status(503);
res.send("503 Service Unavailable.");

ან პირდაპირ მიაბავ სენდს და სტატუსს:
CODE
res.status(404).send("404 Not found.");

ასევე შეგიძლია გააგზავნო სტატუსი ტექსტის გარეშე ან სპეციალურად გამზადებულ ფაილთან ერთად:
CODE
res.status(404).end(); //  ტექსტის გარეშე გაგზავნა

CODE
res.status(404).sendFile('/home/myuser/myapp/static/404.html');


JSON-ად გადაცემას რაც შეეხება, არ აქვს მნიშვნელობა ერორს აგზავნი თუ არა, JSON ჰედერი და ობიექტის სტრინგიფიცირება გჭირდება:
CODE
var myJsonObject = { lorem: 'ipsum' };

res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify(myJsonObject));

Posted by: Roofus 19 Nov 2016, 14:56
X2D3T9
CODE

if(error){
res.send("error":error.status);
return;
}
else{
res.send("error":null, "info":"some_info");
}

Posted by: X2D3T9 19 Nov 2016, 16:24
აჰააა გასაგებია ესეიგი რას ვაკეთებ შეხედეთ smile.gif

ერთი მიდლვეირი რომელიც მაქვს შემდეგი
თუ რამე ჩეპე მოხდა კოდში ვაგზავნი 500 მერე კლიენტის შევამოწმებ და დავუგენერირებ შესაბამის შეტყობინებას

CODE

app.use(function (err, req, res, next) {
 //console.error(err.stack)
 res.status(500).end();
 next();
})


ესეც ერთერთი როუტი

CODE

app.get('/api',cors(corsOptions),function(req,res,next){
 getModel.getMyData()
   .###c(function(err,data){
     if (err) {
       res.status(404).send({ error: '404 Something failed!' })
       next();
     }else{
       res.send(data);
     }
   });
});


აქ ბაზიდან მომაქვს ინფო თუ რამე ჩეპე მოხდა ვაგზავნი 404 ს და რაღაც მესიჯს ეს ისე სატესტოდ

ყველაფერი დავტესტე ბაზის შეცდომაც,ან კოდში რამე სხვა შეცდომა გავიდა კოდი არ ეკიდება და აგზავნის 500 ს კლიენტს

ეხლა მაინტერესებს რას ვაკეთებ არასწორად? givi.gif

კლიენტი სულ ცალკეა დატას იღებს ჯეისონ ფორმატში დალშე იქვამუშავებ
პატარა აპლიკაციას ვაკეთებ რომ დავასრულებ წარმოგიდგენთ ჩემს ნაწვალებს smile.gif

კიდე რაღაც კითხვები მაქვს მაგრამ ეხლაა არა რომ მივალ იქამდე მერე გკითხავთ smile.gif

ხო ჯსონს რაც შეეხება ეს მაქვს

app.use(bodyParser.json({limit: '10mb'}));

სოკეტის გამოყენებს ვაპირებ მაგრამ როგორც ჩანს რასაც ვფიქრობდი არასწორი მიდგომაა მერე გკითხავთ ამაზეც მანდამდე რომ მივალ

Posted by: web_nts 19 Nov 2016, 16:42
Roofus
no.gif
QUOTE
res.send("error":error.status);

SyntaxError: missing ) after argument list
QUOTE
return;

რა დანიშნულება აქვს?
QUOTE
res.send("error":null, "info":"some_info");

SyntaxError: missing ) after argument list

სწორი ფორმა იქნებოდა ეს
CODE
if (error) {
   res.status(error.status).send({ error: error.status });
} else {
   res.send({ "error":null, "info":"some_info" });
}

მაგრამ მე პირადად მირჩევნია რომ ჰედერი და სტრიგიფიცირება მე თვითონ გავუკეთო, ვიდრე ექსპრესს გადავაბარო
CODE
res.setHeader('Content-Type', 'application/json');
res.status(error.status).send(JSON.stringify({ error: error.status }));

პირდაპირ ექსპრესისთვის ობიექტის გადაცემისას სტრინგიფაის და ჰედერს ექსპრესი აკეთებს ავტომატურად. ამ შემთხვევაში კი მე ვაკონტროლებ სტრინგიფაის, შემიძლია pretty-print გავაკეთო დეველოპმენტისას JSON.stringify({ "error":null, "info":"some_info" }, null, '\t'); ან გამოვიყენო replacer რასაც ექსპრესში პირდაპირ ობიექტის გადაცემისას ვერ ვიზავ.

ისე setHeader მუშაობს, მაგრამ იდეაში ჩანაცვლებულია უბრალოდ set -ით ახალ ექსპრესში.
CODE
res.set('Content-Type', 'application/json');

ასევე რამოდენიმე ჰედერის ერთად დამატება შეიძლება ობიექტად
CODE
res.set({
 'Content-Type': 'text/plain',
 'Content-Length': '123',
 'ETag': '12345'
});

http://expressjs.com/en/api.html#res.set

Posted by: web_nts 19 Nov 2016, 17:14
X2D3T9
მე მგონი use და next არასწორად გაიგე smile.gif
QUOTE
app.use(function (err, req, res, next) {
//console.error(err.stack)
res.status(500).end();
next();
})

use-ში რასაც ჩაწერ, ის ყველა როუტზე სრულდება თან სანამ როუტის კოდამდე მიაღწევს მანამდე. შენს შემთხვევაში next() არაფერს არ აკეთებს ვინაიდან res.status(500).end(); ამ კოდის მერე res რესურსი აღარ არსებობს (end ანადგურებს) და ყველა როუტი ჩაკეტილია ავტომატურად ამ ფუნქციის მიერ.

use უნდა გამოიყენო დამხმარე ფუნქციად რომელიც სრულდება როუტის მოთხოვნამდე...

აი პატარა მაგალითი:
CODE
'use strict';

var express = require('express'),
   app = express();

app.use(function(req, res, next) {
   req.MYAPP = { date: new Date().toDateString() };
   next();
});

app.get('/', function (req, res) {
 res.send(req.MYAPP.date);
});

app.listen(3000);

პირველად შესრულდა ის ფუნქცია რაც იყო მოთავსებული .use-ში, ამ ფუნქციაში შეიქმნა დროებითი ობიექტი (MYAPP) ამჟამინდელი თარიღით რომელიც დაემატა req ობიექტს, შემდეგ შესრულდა next() და გადავედით როუტერზე. შენს კოდში სანამ როუტერამდე მივა მანამდე ასრულებ ყველაფერს res.status(500).end(); ამ მოთხოვნით (res ობიექტს ანადგურებ).

CODE
app.get('/api',cors(corsOptions),function(req,res,next){
getModel.getMyData()
  .###c(function(err,data){
    if (err) {
      res.status(404).send({ error: '404 Something failed!' })
      next();
    }else{
      res.send(data);
    }
  });
});

ამ კოდში კი next-ის გამგრძელებელი არ გაქვს არაფერი.

Posted by: X2D3T9 19 Nov 2016, 17:24
web_nts

აჰა ესეიგი ეს ნექს გავიგე

ესეც შეიძლება ხო next(err);

ავიჭერი ეხლა ეს use რომელშიც მოქცეული მაქვს მაგალითად ეს
რომელიც ექსპრესს უწერია დეფაულტად ეს მიდლვერები

CODE

// catch 404 and forward to error handler
app.use(function(req, res, next) {
 var err = new Error('Not Found');
 err.status = 404;
 next(err);
});

// error handler
app.use(function(err, req, res, next) {
 // set locals, only providing error in development
 res.locals.message = err.message;
 res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
 res.status(err.status || 500);
 res.send('error');
});


და არის როუტების დაბლა

ეხლა შევამოწმე და როუტების მაღლა ამის ატანის დროს არ Mუშაობს მაგალითად დბ-ს კოდში შეცდომა გავაკეთე და გამომიყარა მთლიანი სტეკი შეცდომის


Posted by: web_nts 19 Nov 2016, 17:26
X2D3T9
შენს მაგალითში ერორზე ნექსთი რომ გამოიყენო, ასე უნდა გააკეთო
CODE
app.get('/api', cors(corsOptions), function(req, res, next){
   getModel.getMyData().###c(function(err,data){
       if (err) {
           next();
       }else{
           res.send(data);
       }
   });
}, function (req, res) {
   res.status(404).send({ error: '404 Something failed!' });
});

* * *
X2D3T9
QUOTE
ავიჭერი ეხლა ეს use რომელშიც მოქცეული მაქვს მაგალითად ეს
რომელიც ექსპრესს უწერია დეფაულტად ეს მიდლვერები

დეფოლტის მოდიფიკაცია თუ გინდა ასე უნდა გააკეთო:
CODE
var express = require('express'),
   app = express();

app.use(function (err, req, res, next) {
   res.status(500).send({error: err.stack});
});

app.get('/api', cors(corsOptions), function(req, res){
   getModel.getMyData().###c(function(err,data){
       res.send(data);
   });
});

app.listen(3000);

ერორის შემთხვევაში მომენტალურად შესრულდება use-ში რაც წერია
CODE
res.status(500).send({error: err.stack});

და არავითარი ნექსთის გამოყენება არ დაგჭირდება.
CODE
res.send(data);

ავტომატურად დაიგნორდება ვინაიდან ერორი გამოიყენებს პირველად send-ს და მეორე send ავტომატურად იგნორდება.
* * *
X2D3T9
QUOTE
ეხლა შევამოწმე და როუტების მაღლა ამის ატანის დროს არ Mუშაობს მაგალითად დბ-ს კოდში შეცდომა გავაკეთე და გამომიყარა მთლიანი სტეკი შეცდომის

ხო, მეც შეცდომით დამიწერია მაგალითში. use-ს გამოყენებისას მდებარეობას მნიშვნელობა აქვს. ჩემს მაგალითშიც ქვემოთ უნდა იყოს use.

CODE
var express = require('express'),
  app = express();

app.get('/api', cors(corsOptions), function(req, res){
  getModel.getMyData().###c(function(err,data){
      res.send(data);
  });
});

app.use(function (err, req, res, next) {
  res.status(500).send({error: err.stack});
});

app.listen(3000);

Posted by: X2D3T9 19 Nov 2016, 19:48
web_nts

გასაგებია გავიასნდი მადლობა wink.gif

რა მაინტერესებს ეხლა ეს ინფოს წამოღების ფუნქციაში api როუტში რომ სრულდება err ქოლბექის არგამოყენება ანუ უყურადღებოთ დატოვება სწორია? თუ მაგაზეც ის 500 ის მიდლვერი აგებს პასუხს?

Posted by: Svani91 22 Nov 2016, 03:34
აქ ვიკითხავ ბარემ

nginx დავაყენე და წვდომა რო მქონოდა iptables გავთიშე საერთოდ

სწორია ესე?

Posted by: Roofus 22 Nov 2016, 05:08
Svani91
QUOTE
სწორია ესე?

არანაირად არ არის სწორი.

მარტო 80 პორტი გახსენი...

მოკლავ ეგრე სერვერს... თან ძალიან მალე ...

ბრუტით აიღებენ და ვირუსს აგკიდებენ... ბოტები...

მარტო 80 პორტი გახსენი.

user posted image

აჰა iptable-იც აყენია და fail2ban-იც... ანუ ბანში მიდიან მე-3 არასწორ ცდაზე და მაინც რამდენია...

ანუ სადღაც 48 საათში დაახლოებით 400 სხვადასხვა ჰოსტიდან იყო მცდელობა SSH-ზე...
ხოდა წარმოიდგინე რომ თავი არ დაიცვა რამდენ დღეში გაგტეხავენ?

გაგტეხავენ და მერე შენი სერვერი იქნება მაგათი ვირუსის გასავრცელებელი ნოდი... biggrin.gif


პ.ს. AWS-ზე დავრეგისტრირდი და ძალიან დამევასა biggrin.gif <3
REHL + თავიანთი ფაირვოლი.

Posted by: Svani91 22 Nov 2016, 05:36
Roofus

მადლობა, გავაკეთე up.gif

Posted by: Roofus 22 Nov 2016, 05:59
Svani91
QUOTE
მადლობა, გავაკეთე

არაფრის, წარმატებები up.gif

Posted by: Svani91 22 Nov 2016, 06:07
Roofus
web_nts

თქვენ გაიხარეთ, nginx - იც გავუშვი 80 - ზე და node - ც ზედ დავაყოლე, მუშაობს!
* * *
დომენი უნდა ვიყიდო და ჩემი vps დნს სერვერად როგორ ვაქციო დაწერეთ თუ მოიცლით up.gif

Posted by: web_nts 23 Nov 2016, 02:53
Svani91
QUOTE
დომენი უნდა ვიყიდო და ჩემი vps დნს სერვერად როგორ ვაქციო დაწერეთ თუ მოიცლით

არ აიტკიო თავი ტყუილად smile.gif DNS მართვა ასე ადვილი არ არის... თან რა საჭიროა როდესაც მილიონი უფასო და ფასიანი ვარიანტია? დომენი სადაც იყიდე იმათვე ექნებათ DNS მართვის პანელი რომელშიც A ჩანაწერს გააკეთებ შენი სერვერის IP-ზე და ეგაა.

უფრო დახვეწილი, დაცული, პროფესიონალური და რაც მთავარია უფასო DNS + CDN სერვისისთვის გამოიყენე https://www.cloudflare.com/

Posted by: Svani91 23 Nov 2016, 03:24
web_nts

მადლობა up.gif

namecheap - ზე დავამატე უკვე A ჩანაწერი, ალბათ ივარგებს
* * *
web_nts

დომენს თბილისში იყიდიან, მაგათ მართვა თუ გააკეთეს მაქსიმუმ primary და slave ქონდეთ

ნეიმჩიპისას გავაწერინებ და აქედან ვმართავ მერე

Posted by: Roofus 23 Nov 2016, 06:14
აქვე დავწერ ვისაც nginx - CentOS/REHL ექნება პრობლემა 502 ერორით (no gateway) ანუ ვერ ხედავს ნოდს...

SELINUX-ის პერმიშენების ბრალია

ეს გაუწერეთ

setsebool -P httpd_can_network_connect on

http://serverfault.com/a/699885

Posted by: Svani91 25 Nov 2016, 02:21
ვისაც გახსოვთ ჩემი ჰედერ დატა და მასთან დაკავშირებული პრობლემები, ესე გადავაკეთე

CODE

app.all('/*', function(req, res, next){
   headerData = dataFactory.headerData;
   footerData = dataFactory.footerData
   next();
});

Posted by: Roofus 25 Nov 2016, 10:05
QUOTE (web_nts @ 15 Nov 2016, 21:55 )
Otory
ნუ იდეაში გლობალური გამოდის მაინც ამ აპლიკაციისთვის smile.gif res/req არ გამოუყენებია, app გამოიყენა რაც ზემოთ დაწერა და რომელიც res/req-ისგან განსხვავებით არ ნადგურდება შესრულებიშ შემდეგ. თან მე რასაც ვხდები ამას უნდა რომ სტრინგებში ქონდეს თემის ნაწილები და ყოველი მოთხოვნისას ააწყოს ხოლმე და ამიტომ მგონია რომ გლობალად განსაზღვრა უნდა. შეიძლება სხვანაირად ვიგებთ ორივე და საერთოდ სხვა რამე უნდა biggrin.gif

Svani91
მოკლედ პატარა აპლიკაცია გავაკეთე ტემპლეიტები რომ ნახო იდეაში როგორ მუშაობს ejs-ზეც და mustache-ზეც.

გადმოწერე მიმაგრებული ზიპ ფაილი
ჩააგდე ნებისმიერ ფოლდერში გინდ ვინდოუსზე და გინდ ლინუქსზე სადაც ნოდი გიყენია
გაუშვი კონსოლში npm install
შემდეგ გაუშვი აპლიკაცია npm start
გახსენი ეს ლინკი http://localhost:3000/ejsPage1 და მიყევი სხვა ლინკებს რომელიც მაგ გვერდზეა

ეხლა დაერიე ფაილებს და გაარჩიე აპლიკაცია რას აკეთებს smile.gif ოღონდ კარგად გაარჩიე ტყულად არ მაწვალო sa.gif

მოკლე აღწერა ასეთია:
ფოლდერში themes-ში რასაც ჩააგდებ და რამდენ ფაილსაც ჩააგდებ რომლებთაც აქვს გაფართოება .ejs ან .mustache , აპლიკაცია ყველა ამ ფაილს ჩატვირთავს მეხსიერებაში გაშვებისთანავე და შემდეგ მოთხოვნებს აქედან დააგენერირებს. თემების რენდერის ფუნქცია არის ჩასმული მოდულად რომელსაც ტვირთავს მთავარი ფაილი
CODE
var template = require('./templatetest.js');

და მოთხოვნებს აკეთებს შემდეგნაირად:
CODE
//template(engine, name, data);
// engine არის ტემპლეიტის ძრავის სახელი ejs ან mustache
// name არის themes ფოლდერში განთავსებული ფაილის სახელი გაფართოების გარეშე (main.ejs თუ ქვია ფაილს ვაგზავნით მხოლოდ main-ს)
// data არის პარამეტრები რომელიც გადაეცემა ტემპლეიტებს ობიექტის სახით

res.send(template('ejs', 'main', data));

იმედია გამოგადგება smile.gif

up.gif

Posted by: Svani91 27 Nov 2016, 11:59
web_nts

მოკლედ, აქამდე nosql თან შეხება არ მქონია
დღეს ბევრი ვიფიქრე რელაციებზე

და აქამდე მივედი

https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

CODE

{
"_id" : ObjectId("583a900165f06c2b6a065b76"),
"category" : {
 "id" : "583a271b2662f30f5e2a2f7f",
 "name" : "კატეგორიის სახელი"
},
"name" : "სახელი",
"insertDate" : ISODate("2016-11-27T07:49:21.801Z"),
"image" : "tab4.jpg",
"price" : "115.00",
}



სადაა ჩემი რელაციები biggrin.gif

Mongoose უნდა გამოვიყენო მგონი

Posted by: web_nts 27 Nov 2016, 15:35
Svani91
QUOTE
{
"_id" : ObjectId("583a900165f06c2b6a065b76"),
"category" : {
"id" : "583a271b2662f30f5e2a2f7f",
"name" : "კატეგორიის სახელი"
},
"name" : "სახელი",
"insertDate" : ISODate("2016-11-27T07:49:21.801Z"),
"image" : "tab4.jpg",
"price" : "115.00",
}

რის მიღწევას ცდილობ და ნოდში როგორ აკეთებ მოთხოვნას მთლიანად დაწერე. ვერ მივხვდი user.gif

Posted by: Roofus 27 Nov 2016, 18:18
Svani91
რელაციები საერთოდ არაა...
ეგ არის რომ NoSQL არის დოკუმენტზე ორიენტირებული და არა რელაციაზე.
შესაბამისად სკალირება (ჰორიზონტალური, გაშლილი ანუ) უფრო მარტივია... თეორიაში.
მეც არ მქონია შეხება ჯერ მაგრამ რაც ნეტში გადავიკითხე და რაც წიგნიდან ამოვიკითხე (ეხლა დავიწყე კითხვა) იმის მიხედვით შევეცდები განხსვავება აგიხსნა... და რაც არ უნდა გასაოცარი იყოს მართლა ასეთი სისტემაა.

ანუ შემა (scheme) არ არსებობს მონგოში, შეგიძლია ნებისმიერ დროს შეცვალო წყობა დოკუმენტის (დოკუმენტი არის row mysql-ში ანალოგი მონგოში)

ანუ სხვადასხვა წყობის დოკუმენტები შეიძლება იყოს ერთ კოლექციაში.
მონგუსით შეგიძლია შექმნა ფსევდო შემა და ვსევდო რელაციები, რომლებიც იდეაში შეგიძლია დაარღვიო და შეცვალო ნებისმიერ დროს.

მონგოს დოკუმენტი წარმოიდგინე როგორც ჯავასკრიპტის ობიექტი (ჯსონ ფორმაში).


ესეც კიდევ საკმაოდ კარგი წიგნი.

https://www.dropbox.com/s/8d7xz5xznrdnvu2/Kristina%20Chodorow%20%E2%80%94%20MongoDB%20The%20Definitive%20Guide%2C%202nd%20Edition%20%E2%80%94%202013.pdf?dl=0

Posted by: Svani91 28 Nov 2016, 03:37
web_nts

ნატივ მონგოდიბიში მინდოდა ერთი მრავალთან რელაცია, ოღონდ ისე რო მე არ მეწერა sub-query - ები
მონგუსმა გააკეთა საქმე ზუსტად ისე, როგორც მინდოდა, თან ცოტა ენტიტი კოდ ფერსტის მსგავსია და მაგრად მომეწონა სქემების და მოდელების შექმნის საშუალება რომ გაქვს

Roofus

დიდი მადლობა, ზუსტად ეგ არის რაც მინდოდა - კატეგორიის და პროდუქტის მიბმა და როცა პროდუქტი მომაქვს, მოყვება მირეფერენსებული კატეგორიაც

ეს სქემა ორივე დოკუმენტის

CODE

var subCategorySchema = new Schema({
   _id: Number,
   name: String,
   _parentCategory: { type: Number, ref: 'Category' },
   products: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
});

var productSchema = new Schema({
   _id: Number,
   name: String,
   sale: Number,
   insertDate: Date,
   price: Number,
   oldPrice: Number,
   image: String,
   size: String,
   _category: { type: Number, ref: 'SubCategory' }
});


ეს query

CODE

Product.find({}).populate('_category').###c(function(err, prods){
   console.log(prods);
});


Posted by: Roofus 28 Nov 2016, 05:24
Svani91
QUOTE
Product.find({}).populate('_category').###c(function(err, prods){
   console.log(prods);
});

არაფრის...
up.gif

Posted by: Svani91 12 Dec 2016, 05:49
უსაფრთხოების მხრივ, რას მეტყვით ჩემზე გამოცდილო ხალხო? smile.gif)

https://expressjs.com/en/advanced/best-practice-security.html

Posted by: web_nts 12 Dec 2016, 18:40
Svani91
https://blog.risingstack.com/node-js-security-checklist/ აქ არის კარგად აღწერილი ყველაფერი up.gif

Posted by: Svani91 15 Dec 2016, 22:34
web_nts

მადლობა up.gif


Posted by: AIX-500 22 Dec 2016, 02:39
nodejs-ში კარგად ვინც ერკვევა. ოღონდ აი ძაან კარგად უნდა იცოდეს async,restapi,json და გააჩნია problem solving skills და ერკვევა linux-ში და იცის bash ასევე გარკვეულ წილად იცის nodejs internals და იცის როგორ იპოვნოს memory leak და შეუძლია c++-ზე დაწეროს nodejs-სთვის პლაგინი მაშინ ძალიან მაღალ ხელფასად ქამან.
ზემო ჩამოთვლილი თითეული საკითხის არ ცოდნაში ხელფასს აკლდება 500$. ასე რომ დამწყები თუ ხარ მაქს 500$ დალშე იმის და მიხედვით რა იცი.

Posted by: gio_rgi 2 Oct 2017, 18:01

https://www.youtube.com/watch?v=DG3i75kF7D0&list=PL4N8D_M1qD6E8k2o8v9eCTai20SP5fhct
https://www.youtube.com/watch?v=aJlB07_JTs0&list=PL4N8D_M1qD6GWhlfyAIkUqtR472L9wcT0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)