محمد افاضاتی

دیده ها، شنیده ها و علاقه مندی های یک برنامه نویس
سه شنبه, ۸ فروردين ۱۳۹۱، ۰۹:۳۷ ب.ظ

NodeJs

در معرفی Nginx توضیح دادم که event-driven, non-blocking یعنی چه... ساختاری که با event که همان درخواست هست جوابگوی درخواست ها هست.

ایده ای جذاب که با ایده جذاب دیگری ترکیب شده است.

اجرای کد های جاوا اسکریپت در پروژه هایی همچون CommonJs دیده شده بود ولی با اینکه javaScript زبانی مجزا از مرورگر بود (با اینکه به مدیریت نت اسکیپ طراحی شد ولی کاملا مجزا بود ولی با دادن LiveScript توسط netscape یا jScript توسط IE خیلی به عنوان زبانی که فقط برای مرورگر است دیده شده است) کمی غریب دیده میشدند. ایده کلی این بود که جاوا اسکریپت مختص مرورگر نیست.

Nodejs در حقیقت با استفاده از V8 که engine مربوط به chrome است کار می کند.

Nodejs پلتفرمی است بر مبنای موتور جاوا اسکریپت کروم که به منظور ایجاد برنامه های سریع و گسترش پذیر به وجود آمده است. Nodejs از مدل رویدادگرا و non-blocking برای انجام عملیات I/O بهره می برد. از این‌رو Nodejs یک پلتفرم سبک و کارا برای پیاده سازی برنامه های Real-time و مبتنی بر داده است که می توانند به راحتی در سرورهای نامتمرکز اجرا شوند.

 

طریقه نصب:

در کل در اکثر دیسترو ها package مربوطه وجود دارد و خیلی راحت می توانید نصب کنید. به طور مثال در Archlinux اینگونه خواهد بود

efazati@KaraOS ~ % sudo pacman -S nodejs

resolving dependencies...
looking for inter-conflicts...

Targets (1): nodejs-0.6.14-1

Total Download Size:    2.79 MiB
Total Installed Size:   14.21 MiB

Proceed with installation? [Y/n]
:: Retrieving packages from community...
 nodejs-0.6.14-1-x86_64                         2.8 MiB  42.5K/s 01:07 [#######################################] 100%
(1/1) checking package integrity                                       [#######################################] 100%
(1/1) loading package files                                            [#######################################] 100%
(1/1) checking for file conflicts                                      [#######################################] 100%
(1/1) checking available disk space                                    [#######################################] 100%
(1/1) installing nodejs                                                [#######################################] 100%
Optional dependencies for nodejs
    openssl: TLS support

 

به طور مثال شما با کد زیر می توانید Nodejs را راه اندازی کنید و به همه درخواست Hello To Efazati Blog بگویید.

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello To Efazati Blog\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

کافی است در یک فایل مثلا test.js بگذارید و با دستور زیر اجرایش کنید.

% node example.js
Server running at http://127.0.0.1:1337/

حالا صفحه شما اجرا می شود
شما توانستید اولی برنامه Nodejs خودتون را بنویسید.

 

NPM:

Nodejs به علت جذابیت هایی که دارد طرفدارن زیادی را جذب کرده و همین باعث شد کلا کد های زیادی با node نوشته شود. یکی از نتایج این قضیه ساخت یک package manager است که با استفاده از آن می توانید برنامه هایی که توسط node نوشته است را پیدا کرده و نصب کنید.

اسم این package manger خوب Npm است.

به طور مثال package بسیار جالب mysql رو با هم نصب می کنیم

npm install mysql

 

بعد از نصب یک فایل mysql.js درست کنیم و کد زیر را بزنیم

var mysql = require('mysql');
var TEST_DATABASE = 'nodejs_mysql_test';
var TEST_TABLE = 'test';
var client = mysql.createClient({
  user: 'root',
  password: 'root',
});

client.query('CREATE DATABASE '+TEST_DATABASE, function(err) {
  if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) {
    throw err;
  }
});

// If no callback is provided, any errors will be emitted as `'error'`
// events by the client
client.query('USE '+TEST_DATABASE);

client.query(
  'INSERT INTO '+TEST_TABLE+' '+
  'SET title = ?, text = ?, created = ?',
  ['super cool', 'this is a nice text', '2010-08-16 10:00:23']
);

client.query(
  'SELECT * FROM '+TEST_TABLE,
  function selectCb(err, results, fields) {
    if (err) {
      throw err;
    }

    console.log(results);
    console.log(fields);
    client.end();
  }
);

 

بعضی کتابخانه های استاندارد Node:

 

 

همچنین ببینید:

node.js -> http://www.nodejs.org/

node.js کاربران ایرانی nodejs -> http://nodejs.ir/

The Node Beginner Book » A comprehensive Node.js tutorial -> http://www.nodebeginner.org/

node node -> http://nodenode.com/

nodejs-fa | Google Groups -> http://groups.google.com/group/nodejs-fa?pli=1

Streaming file uploads with node.js » Debuggable - Node.js Consulting -> http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb

 



نوشته شده توسط محمد افاضاتی
ساخت وبلاگ در بلاگ بیان، رسانه متخصصان و اهل قلم

محمد افاضاتی

دیده ها، شنیده ها و علاقه مندی های یک برنامه نویس
محمد افاضاتی
محمد افاضاتی برنامه نویس python php دیتابیس های postgresql mongodb و ...

رونوشتی از علاقه مندی هایم برای ماندگار تر شدن!

تبلیغات

طبقه بندی موضوعی

Feedburner RSS

Others

توییتر

NodeJs

سه شنبه, ۸ فروردين ۱۳۹۱، ۰۹:۳۷ ب.ظ

در معرفی Nginx توضیح دادم که event-driven, non-blocking یعنی چه... ساختاری که با event که همان درخواست هست جوابگوی درخواست ها هست.

ایده ای جذاب که با ایده جذاب دیگری ترکیب شده است.

اجرای کد های جاوا اسکریپت در پروژه هایی همچون CommonJs دیده شده بود ولی با اینکه javaScript زبانی مجزا از مرورگر بود (با اینکه به مدیریت نت اسکیپ طراحی شد ولی کاملا مجزا بود ولی با دادن LiveScript توسط netscape یا jScript توسط IE خیلی به عنوان زبانی که فقط برای مرورگر است دیده شده است) کمی غریب دیده میشدند. ایده کلی این بود که جاوا اسکریپت مختص مرورگر نیست.

Nodejs در حقیقت با استفاده از V8 که engine مربوط به chrome است کار می کند.

Nodejs پلتفرمی است بر مبنای موتور جاوا اسکریپت کروم که به منظور ایجاد برنامه های سریع و گسترش پذیر به وجود آمده است. Nodejs از مدل رویدادگرا و non-blocking برای انجام عملیات I/O بهره می برد. از این‌رو Nodejs یک پلتفرم سبک و کارا برای پیاده سازی برنامه های Real-time و مبتنی بر داده است که می توانند به راحتی در سرورهای نامتمرکز اجرا شوند.

 

طریقه نصب:

در کل در اکثر دیسترو ها package مربوطه وجود دارد و خیلی راحت می توانید نصب کنید. به طور مثال در Archlinux اینگونه خواهد بود

efazati@KaraOS ~ % sudo pacman -S nodejs

resolving dependencies...
looking for inter-conflicts...

Targets (1): nodejs-0.6.14-1

Total Download Size:    2.79 MiB
Total Installed Size:   14.21 MiB

Proceed with installation? [Y/n]
:: Retrieving packages from community...
 nodejs-0.6.14-1-x86_64                         2.8 MiB  42.5K/s 01:07 [#######################################] 100%
(1/1) checking package integrity                                       [#######################################] 100%
(1/1) loading package files                                            [#######################################] 100%
(1/1) checking for file conflicts                                      [#######################################] 100%
(1/1) checking available disk space                                    [#######################################] 100%
(1/1) installing nodejs                                                [#######################################] 100%
Optional dependencies for nodejs
    openssl: TLS support

 

به طور مثال شما با کد زیر می توانید Nodejs را راه اندازی کنید و به همه درخواست Hello To Efazati Blog بگویید.

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello To Efazati Blog\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

کافی است در یک فایل مثلا test.js بگذارید و با دستور زیر اجرایش کنید.

% node example.js
Server running at http://127.0.0.1:1337/

حالا صفحه شما اجرا می شود
شما توانستید اولی برنامه Nodejs خودتون را بنویسید.

 

NPM:

Nodejs به علت جذابیت هایی که دارد طرفدارن زیادی را جذب کرده و همین باعث شد کلا کد های زیادی با node نوشته شود. یکی از نتایج این قضیه ساخت یک package manager است که با استفاده از آن می توانید برنامه هایی که توسط node نوشته است را پیدا کرده و نصب کنید.

اسم این package manger خوب Npm است.

به طور مثال package بسیار جالب mysql رو با هم نصب می کنیم

npm install mysql

 

بعد از نصب یک فایل mysql.js درست کنیم و کد زیر را بزنیم

var mysql = require('mysql');
var TEST_DATABASE = 'nodejs_mysql_test';
var TEST_TABLE = 'test';
var client = mysql.createClient({
  user: 'root',
  password: 'root',
});

client.query('CREATE DATABASE '+TEST_DATABASE, function(err) {
  if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) {
    throw err;
  }
});

// If no callback is provided, any errors will be emitted as `'error'`
// events by the client
client.query('USE '+TEST_DATABASE);

client.query(
  'INSERT INTO '+TEST_TABLE+' '+
  'SET title = ?, text = ?, created = ?',
  ['super cool', 'this is a nice text', '2010-08-16 10:00:23']
);

client.query(
  'SELECT * FROM '+TEST_TABLE,
  function selectCb(err, results, fields) {
    if (err) {
      throw err;
    }

    console.log(results);
    console.log(fields);
    client.end();
  }
);

 

بعضی کتابخانه های استاندارد Node:

 

 

همچنین ببینید:

node.js -> http://www.nodejs.org/

node.js کاربران ایرانی nodejs -> http://nodejs.ir/

The Node Beginner Book » A comprehensive Node.js tutorial -> http://www.nodebeginner.org/

node node -> http://nodenode.com/

nodejs-fa | Google Groups -> http://groups.google.com/group/nodejs-fa?pli=1

Streaming file uploads with node.js » Debuggable - Node.js Consulting -> http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb

 

موافقین ۰ مخالفین ۰ ۹۱/۰۱/۰۸
محمد افاضاتی npm commonjs v8 نود nodejs javascript node

نظرات  (۱۳)

 من در این پست فرق بین node.js و nginx را متوجه نشدم و یا اینکه اگر  بخواهم با پایتون برنامه‌نویسی کنم کار به چه صورت است؟
و یا فرقه این مورد با twisted در چیست چون آن هم event-driven است!!
کدام بهتره؟
پاسخ:
اول پست توضیح دادم که engine مربوط به nodejs چه فرقی با nginx دارد که v8 engine مربوط به nodejs است. شما برای برنامه نویسی با پایتون مطلقا نیازی به nodejs ندارید.
به طور کلی اینگونه می توانم بگویم که اگر برنامه ی python دارید و نیاز به کاری دارید که در nodejs راحت تر و روان تر است با چیزی مثل socket با nodejs و برنامه ای که با javascript نوشته اید ارتباط بر قرار می کنید.
twisted هم ابزار بسیار قدرتمندی است ولی چند عیب و حسن دارد
۱- نیاز به دانش python دارد و چیز دیگری بر روی آن اجرا نمی شود همان طور که javascript برای nodejs است. (فکر می کنم کلا پایتون کار بسیار کمتر از js کار است)
۲- twisted کد بسیار پیچیده ای دارد و با اینکه مدت زیادی وجود دارد منابع کمی دارد (البته یک کتاب هم دارد)
در کل استفاده از هر کدام از این موارد نیازمند این است که چگونه راحت ترید... چند مقایسه وجود دارد که نشان دهنده این است که واقعا برای دولوپر ها هم همینطور بوده اما در اصل از نظر امکانات تقریبا شبیه هم هستند.
اگر عمری باقی باشد شاید اینها رو تست کردم و یک جا گذاشتم
Eric Day - Scale Stack vs node.js vs Twisted vs Eventlet -> http://oddments.org/scalestack-vs-node-vs-twisted-vs-eventlet
javascript - What are the use cases of Node.js vs Twisted? - Stack Overflow -> http://stackoverflow.com/questions/3461549/what-are-the-use-cases-of-node-js-vs-twisted
What are the benefits of developing in node.js versus Python? - Quora -> http://www.quora.com/What-are-the-benefits-of-developing-in-node-js-versus-Python
The Switch: Python to Node.js -> http://journal.paul.querna.org/articles/2011/12/18/the-switch-python-to-node-js/
قبل از هر چیز ممنون که وقت گذاشتید و جواب  دادید
چندتا ستوال :)
* می‌دونیم که node روی یک thread اجرا می‌شود ، پس بخاطر همین احتیاج به synchronization  توابع ندارد و یک عیب هم دارد که فقط یکی از هسته‌های cpu را مورد استفاده قرار می‌دهد
ولی خوب چند جا هم دیدم برای استفاده کامل از cpu ، مثلا بخش دریافت  connection را روی چند هسته قرار می‌دهند ، ولی این کار باعث مشکل  synchronization نمی‌شود؟ یا تصور من از synchronization در node اشتباه است؟

* در ویکی  tornado  یک benchmark نمایش داده شده که در اولین سطح آن tornado در پشت nginx قرار گرفته و بیشترین کارای را دارد. قرار گرفتن ۲تا وب سرور  event-driven چه کاربردی دارد و چرا از همان nginx به طور مجزا استفاده نشده
پاسخ:
برای synchronization درست تر این هست که همه چیز را شخصا implement کنید. یعنی طراحی listener conention یا هر چیز دیگری یک تابع باشد و در نهایت به عنوان load balancer به توابع دیگر بدهد. یا با یک flag در RAM یا DB مشخص کند کدام سرور باید اجرا کند. کلا حسم برای هر چیز event driven ی که بیش از یک سرور شود همین است.

در مورد تورنادو هم می تونم بگویم که معمولا برنامه های این چنینی امکانات بیشتری می دهند. nginx در این مثال بیشتر حواسش به load balancing است و به سمت مدیریت event ها نمی رود از طرفی می شود گفت طراحی برنامه برای nginx به این راحتی ها نیست ( خیلی هم سخت نیست ولی از تورنادو و twisted سخت تر است)
من در بحثی که در مورد چیزهایی مثل push server هم داشتیم همیشه بر این عقیده بودم که چون طراحی در سمت nginx کار راحتی هست بهتر است از همان سیستم استفاده کنیم. اما در بعضی موارد که کار بیشتر است عمل lb رو با بقیه کار ها جدا می کنند.
من منظورت رو متوجه نمی‌شوم که nginx بیشتر حواسش به load balancing است و به سمت مدیریت event ها نمی‌رود
چون اگر به این صورت باشد ، در یکی از پست‌های خودتان از nginx استفاده کردید با uwsgi که خودش (processor /thread model) هست ، یعنی مدیریت event نداریم ، البته می‌گم متوجه منظورت نشدم.

یک جا هم  گفتید "عمل lb رو با بقیه کارها جدا می‌کنند" یعنی nginx این قابلیت در آن گنجانده  شده است که بتوان event-driven را روی چند سرور پخش کرد؟ مثلا یک سرور مخصوص اجرای درخواست‌های DB باشد و بازخورد event را به سرور اول برگرداند.

خوب یک پیشنهاد هم بکنم :) لطفآ از ویرگول در نوشته‌هایتان استفاده کنید.
پاسخ:
uwsgi اونجا event handler هست، nginx حواسش هست که هر event رو یک instance اجرا کند. به طور مثال در همان مثال nginx دو لایه lb انجام می شود یکی در سطح uwsgi یک در سطح nginx
به طور مثال ۴ تا تورنادو دارید و nginx هر درخواست را به سروری که خلوت تر است می دهد. حالا به خود اون برنامه ربط داره هر event را چگونه مدیریت می کند.

در مورد اینکه آیا nginx event را می فهمد یا نه؟ باید بگم آره،شما با url می تونید مثلا بگویید به کدام uwsgi برود ولی منظورم این نبود.
شما چند سرور خواهید داشت که هر کدوم یک worker یا مثلا uwsgi instance از برنامه شما هستند. که درخواست را اجرا می کنند.
حالا شما یک برنامه در انتها دارید، همه event ها به برنامه شما می آید چیزی مثل sync بین thread ها وجود ندارد. کافیست وقتی یکی شروع به کار بر روی هر event می کند بگوید من روی این event کار می کنم کسی کار نکنه و در نتیجه مشکل thread حل می شود. البته بحث زیاد است به نسبت کاری که می خواهید بکنید راه حل فرق می کند.

ببخشید تلاش کردم ویرگول داشته باشه :D من بعدا می خونم می بینم بعضی جا ها گویا نبوده :D
 خیلی ممنون که لطف داشتی و وقت گذاشتی
من خودم بر روی یک engine برای workflow کار می‌کنم که با پایتون و  ORM جنگو در حال تکمیل شدن است.
خوشحال می‌شوم اگر تجربیات شما را ، در این زمینه هم بتوانیم ببینیم در بلاگ و همچنین بیشتر ارتباط داشته باشیم.
پاسخ:
خواهش می کنم.
یه چیزی که فکر می کنم خیلی خوب باشه اینه OpenERP - Open Source Business Applications -> http://www.openerp.com/

خیلی خوشحالم که با زبان خیلی غریب (تو ایران) پایتون :D و فریم ورک غریبتر django کار می کنی
من تو irc با یوزر efazati هستم خوشحال میشم
منم خوشحالم شما با یک فریم‌ورک خیلی غریب تر مثل openERP آشنا هستید.
گروه ما بیشتر از یک سال است که این برنامه را دنبال می‌کند ولی متاسفانه workflow بسیار ابتدای دارد به همین دلیل مجبور به ارتقای یک workflow هستیم.
دوست دارم بدانم شما در چه حد آشنای دارید و یا علاقه‌ای به فعالیت روی این زمینه دارید.

پاسخ:
خیلی کم در حد اذیت کردن با openERP کار کردم چون فکرشو دوست داشتم.
در مورد کارم من تمام وقت در شرکت بیان مشغول کارم. اما سوال داشتی تا جایی که بتونم راهنمایی (در حد دانشم :D ) می کنم ;)
 نکنه شما هم از بچه‌های شریف هستید :)
محصولات شرکتان را دیدم ، بر مبنای سرویس‌دهی بلاگ و میل بود ، پینگ هم هنوز کار نمی‌کرد
فعلآ که workflow ما به قسمت‌های پایانی نرسیده و کار دارد. اگر بر روی سرور شرکت آمد ، نظر شما را هم جویا می‌شویم

من بیشتر تو gmail هستم متاسفانه تا IRC :) خوشحال می‌شوم در gtalk ببینمتان 
۰۸ خرداد ۹۱ ، ۰۰:۴۶ مهدی یوسفی
سلام
ما در حال بررسی این نرم افزار برای پیاده سازی آن هستیم. خوشحال می شوم در تماس باشیم.  
۲۱ شهریور ۹۱ ، ۰۹:۰۲ افشین مهربانی
عالی بود محمد، مرسی.
۱۸ شهریور ۹۲ ، ۱۲:۲۴ جلال رسولی زاده
سلام آقای افاضاتی
من تازه کار با اوراکل رو شروع کردم. از من خواستن که باید یک ارتباط بین اوراکل و node.js برای رد و بدل کردن xml برقرار کنم.من هیچ ایده ای برای انجام این کار ندارم. لظفا اگه میشه من رو راهنمایی کنید. ((البته اگه امکانش هست با زبون ساده بگید که ما تازه کار ها هم متوجه بشیم))
salam.man mikham bedoonam node dar iran dar hosting khasi support mishe?age nashe chetor mitoonam azashestefade konam???????

پاسخ:
شما میتوانید vps بگیرید.
تو شقزون تو
چرا وقتی توی ترمینال npm install mysql رو وارد میکنم کلی ارور میده @
سلام من اگه بخوام قسمت نظرات ب سایتم اضافه کنم با استفاده از nodejs باید چکار کنم

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی