<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات Node.js</title>
        <link>https://virgool.io/nodejs/feed</link>
        <description>Node.js Article</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:23:52</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/49wdug2ucmpw/jwzwf1.png</url>
            <title>Node.js</title>
            <link>https://virgool.io/nodejs</link>
        </image>

                    <item>
                <title>تفاوت  نود جی اس و جاوا اسکریپت</title>
                <link>https://virgool.io/nodejs/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%87%D8%A7%DB%8C-%D9%86%D9%88%D8%AF-%D8%AC%DB%8C-%D8%A7%D8%B3-%D9%88-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-dgif2xqxv8e3</link>
                <description> در این مقاله سعی دارم که به تفاوت  نودجی اس و جاوااسکریپت بپردازم. شاید بسیاری بگویند نودجی اس همان جاوااسکریپت است که قابلیت اجرا در سمت سرور را هم دارد. اما این تمام ماجرا نیست !جاوااسکریپت یک زبان برنامه نویسی است و تمام ویژگی هایی که یک زبان باید داشته باشد را دارا است. در حالی که نودجی اس (NodeJS) یک محیط برای اجرای کدهای جاوااسکریپت است که دارای مفسر هم می باشد. ذکر این نکته مهم است که  نود جی اس ، انجین v8 گوگل را درون خود دارد که مجموعه ای از کدهای جاوااسکریپت و c++ است .جاوااسکریپت به عنوان یک زبان در هر مرورگری و هر انجینی قابلیت اجرا دارد . پکیج های مختلفی برای جاوااسکریپت نوشته شده است مانند jQuery . نودجی اس هم پکیج هایی را دارد که با سیستم عامل در ارتباط هستند . مانند crypto یا  os . به کمک نود جی اس میتوان بسیاری از دسترسی هایی که به کمک خط فرمان های سیستم عامل را داریم انجام دهیم . نود جی اس ( single-thread  یا  multi-thread ؟)نود جی اس به صورت معموا در یک ترد اجرا می شود . برای مثال کدهای جاوااسکریپت در اپلیکیشن سمت فرانت یا بک اند در یک ترد اجرا میشوند . event-loop هم در همان ترد اجرا می شود . اما  پکیج هایی وجود دارند که در چندین ترد اجرا میشوند . اگر تکه کد زیر را در نودجی اس اجرا کنیم مشاهده میکنیم که زمان اجرای 4 تابع  اول نزدیک به هم است .کد اصلی به همراه نحوه فراخوانی آن (5 مرتبه)بار اول 4 بار تابع صدا شده است. بار دوم تابع 5 بار صدا شده است. زمان اجرای تابع پنجم به وضوح متفاوت است. اگر  تابع را 5 بار را پشت سر هم صدا کنیم زمان اجرای تابع آخر اختلاف فاحشی با زمان اجرا توابع قبلی دارد. علت این است که نودجی اس درون خود از یک کتابخانه به نام  libuvاستفاده می کند . این کتابخانه وظایفی نظیر اجرای برنامه های همروند (concurrent)  ، غیر همزمان  (asynchron)  ، مدیریت تسک های مرتبط با سیستم عامل و ... را دارد. در هنگام اجرای کد بالا، کتابخانه مذکور یک استخر نخ (thread pool) را می سازد . این استخرنخ بر حسب این که  بر روی چه سیستم عاملی پیاده شده است ،  به  صورت پیشفرض به تعداد سی پی یوهای سیستم  است. ( اگر دقیق تر بخواهم بگویم اگر پردازنده شما از تکنولوژی  hyper-threading استفاده می کند و  dual-core است ، به تعداد  ۲ برابر هسته های پردازنده شما است. برای من ۲ هسته و در هسته ۲ نخ یا همان  thread  وجود دارد، پس ۴ پردازش همزمان خواهم داشت) .اجرای تابع پنجم به دلیل درگیر بودن 4 نخ سیستم به پایان اجرای یکی از توابع قبل موکول شده است.نتیجه گیری :نود جی اس یک محیط مانند مرورگر  است که کدهای جاوا اسکریپت میتوانند در آن اجرا شوند با این تفاوت که  توانایی بالایی در دسترسی به منابع سیستم عامل را دارد و از  c++هم پشتیبانی می کند . اما جاوااسکریپت یک زبان است که می تواند هم در مرورگر و هم در محیطی مانند نودجی اس اجرا شود. جاوااسکریپت به تنهایی تک نخی (single-thead)است اما می توان کدهایی نوشت (که با استفاده از کتابخانه های کمکی ) به صورت چند نخی هم اجرا شوند. </description>
                <category>Node.js</category>
                <author>آزاد زرشاد- Azad Zarshad</author>
                <pubDate>Wed, 06 Nov 2019 00:05:01 +0330</pubDate>
            </item>
                    <item>
                <title>دستورات مختلف در node.js</title>
                <link>https://virgool.io/nodejs/%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-%D9%85%D8%AE%D8%AA%D9%84%D9%81-%D8%AF%D8%B1-nodejs-cgej969bnh3r</link>
                <description>تعریف node.jsیک پلتفرم بر پایه موتور جاوا اسکریپت گوگل کروم موسوم به V8 می‌باشد که باعث سهولت ایجاد و مقیاس‌پذیری برنامه‌های تحت شبکه می‌شود. این پلتفرم از یک مدل I/O رویداد محور استفاده می‌کند که مسدود نشونده (non-blocking) است و همین امر باعث کاهش فشار موجود بر روی سرور و افزایش کارآیی می‌شود و این امر برای اجرای برنامه‌های مبتنی بر داده که بصورت بلادرنگ (Real-Time) بر روی سرورهای نامتمرکز استفاده می‌شوند بسیار مناسب است. همچنین یک پلتفرم متن باز برای گسترش برنامه‌های سمت سرور و تحت شبکه می‌باشد. این پلتفرم بر اساس زبان جاوا اسکریپت نوشته شده است و قابلیت پیاده‌سازی بر روی سیستم‌عامل‌های ویندوز، لینوکس و سیستم عامل کامپیوترهای اپل را دارد.دستورات مختلف در node.jsدر این بخش دستورات مورد استفاده در node.js را در سه سطح مبتدی، متوسط و پیشرفته نشان خواهیم داد.سطح مبتدینوشتن hello worldدستور کد زیر را در یک فایلی به نام &quot;hello.js&quot; می‌نویسیم.var http = require(&#039;http&#039;);
http.createServer(function (req, res) {
res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
res.end(&#039;Hello World!&#039;);
}).listen(8080);با دسترسی به پورت 8080 با استفاده از این لینک http://localhost:8080 قادر به دیدن hello word هستیم.درست کردن ماژول کاربر ما می‌تونیم با کد زیر ماژول خود را درست کنیمexports.myDateTime = function () {
return Date();
};و حالا میتونیم از ماژول بالا در کدمون استفاده کرده و از طریق پورت 8080 دسترسی داشته باشیم.var http = require(&#039;http&#039;);
var dt = require(&#039;./myfirstmodule&#039;);
http.createServer(function (req, res) {
res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
res.write(&quot;The date and time are currently: &quot; + dt.myDateTime());
res.end();
}).listen(8080);Output: /summerدرست کردن وب سروربا استفاده از کد زیر می‌تونیم وب سرور در node.js درست کنیمvar http = require(&#039;http&#039;);
//create a server object:
http.createServer(function (req, res) {
res.write(&#039;Hello World!&#039;); //write a response to the client
res.end(); //end the response
}).listen(8080); //the server object listens on port 8080Output: /summerاضافه کردن HTTP هدرما باید هدر HTTP را زمانی که سرور می‌خواد محتوا را در فرمت HTML نشان دهد اضافه کنیم. سپس ما می‌تونیم از هدر HTTP برای محتوایی که نیاز داریم استفاده کنیم.var http = require(&#039;http&#039;);
http.createServer(function (req, res) {
res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
res.write(&#039;Hello World!&#039;);
res.end();
}).listen(8080);Output: /summerخواندن کوئری استرینگبرای خواندن کوئری استرینگ در node.js ما نیاز به پیاده‌سازی کد زیر داریم var http = require(&#039;http&#039;);
http.createServer(function (req, res) {
res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
res.write(req.url);
res.end();
}).listen(8080);اسپلیت کوئری استرینگما می‌تونیم با استفاده از ماژول URL کوئری استرینگ را در node.js اسپلیت کنیم. var http = require(&#039;http&#039;);
var url = require(&#039;url&#039;);
http.createServer(function (req, res) {
res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
var q = url.parse(req.url, true).query;
var txt = q.year + &quot; &quot; + q.month;
res.end(txt);
}).listen(8080);&lt;/codeOutput: خواندن یک فایل در node.jsما می‌تونیم با استفاده از متد ()readFile یک فایل را در node.js بخوانیم.var http = require(&#039;http&#039;);
var fs = require(&#039;fs&#039;);
http.createServer(function (req, res) {
fs.readFile&#40;&#039;demofile1.html&#039;, function(err, data&#41; {
res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
res.write(data);
res.end();
});
}).listen(8080);Output:فایل خالی با استفاده از متد openما می‌تونیم با استفاده از متد open یک فایل خالی در node.js درست کنیم. var fs = require(&#039;fs&#039;);
fs.open(&#039;mynewfile2.txt&#039;, &#039;w&#039;, function (err, file) {
if (err) throw err;
console.log(&#039;Saved!&#039;);
});Output:به روز رسانی یک فایل موجود به روز رسانی یک فایل در node.js در کد زیر نشان داده شده استvar fs = require(&#039;fs&#039;);
fs.appendFile&#40;&#039;mynewfile1.txt&#039;, &#039; This is my text.&#039;, function (err&#41; {
if (err) throw err;
console.log(&#039;Updated!&#039;);
});Output:جایگزینی محتوای موجود در یک فایلتوسط متد ()writeFile می‌تونیم به این امر دست پیدا کنیم. var fs = require(&#039;fs&#039;);
fs.writeFile&#40;&#039;mynewfile3.txt&#039;, &#039;This is my text&#039;, function (err&#41; {
if (err) throw err;
console.log(&#039;Replaced!&#039;);
});Output:سطح متوسطتریگر کردن یک گزارش در خطاهای بحرانیما می‌تونیم زمانی که خطای بحرانی یا Fatal Error رخ داد یک گزارش با استفاده از دستور زیر تریگر کنیم.–diagnostic-report-on-fatalerrorدستور بالا این اجازه را به ما می‌دهد تا گرفتن گزارش را زمانی که خرابی رخ داد فعال کنیم و برنامه مربوطه را terminate کنیم تا خرابی را بررسی و اشکال یابی کنیم.استفاده از console classاستفاده از console class برای اشکال یابی در node.js‌ (همانند JavaScript) می‌باشد و از ۳ متد ()console.log() ،console.error و ()console.warn بهره می‌برد.درست کردن یک کنسول جدید در node.js ما میتونیم یک کنسول جدید در node.js با دستور زیر درست کنیم.const output = fs.createWriteStream(&#039;./stdout.log&#039;);
const errorOutput = fs.createWriteStream(&#039;./stderr.log&#039;);
const logger = new Console({ stdout: output, stderr: errorOutput });
const count =5;
logger.log(‘count:%d’,count);استفاده از certificate class‌ ما می‌تونیم با استفاده از certificate class‌ با کمک ماژول crypto با دیتا SPKAC‌ کار کرده که بیشتر برای دستیابی به خروجی المان &lt;keygen&gt; در HTML‌ استفاده می‌شود.یک instance جدید از certificate classاز طریق کد زیر قابلیت ایجاد یک instance جدید از certificate class هستیم.const crypto = require(‘crypto’);
const cert1 = new crypto.Certificate();
const cert2 = crypto.Certificate();سطح پیشرفتهنحوه انتقال آرگومان‌ها به تابع از طریق کد زیر می‌تونیم آرگومان‌ها را به تابع listener انتقال دهیم.const myEmitter = new MyEmitter();
myEmitter.on(&#039;event&#039;, (a, b) =&gt; {
console.log(a, b, this);
// Prints: a b {}
});
myEmitter.emit(&#039;event&#039;, &#039;a&#039;, &#039;b&#039;);اطلاعات مربوط به asynchronous و synchronous در EventEmitter ،node.js تمامی شنوندگان رو بطور synchronously به ترتیبی که ثبت شده‌اند صدا می‌زند  و تابع‌های گوش دهنده می‌تونن به حالت عملکرد asynchronous با استفاده از متدهای ()setlmmediate و یا ()process.nextTick در بیایند. myEmitter.on(&#039;event&#039;, (a, b) =&gt; {
setImmediate(() =&gt; {
console.log(&#039;this happens asynchronously&#039;);
});
});
myEmitter.emit(&#039;event&#039;, &#039;a&#039;, &#039;b&#039;);برای مطالعه پست‌های بیشتر ما را در وبلاگ کارادمی و یا در ویرگول دنبال کنید.</description>
                <category>Node.js</category>
                <author>Karademy Coding Bootcamp</author>
                <pubDate>Sat, 17 Aug 2019 10:17:39 +0430</pubDate>
            </item>
                    <item>
                <title>روز سی و یکم از چالش ۱۰۰ روز کد زدن - PUG</title>
                <link>https://virgool.io/nodejs/%D8%B1%D9%88%D8%B2-%D8%B3%DB%8C-%D9%88-%DB%8C%DA%A9%D9%85-%D8%A7%D8%B2-%DA%86%D8%A7%D9%84%D8%B4-%DB%B1%DB%B0%DB%B0-%D8%B1%D9%88%D8%B2-%DA%A9%D8%AF-%D8%B2%D8%AF%D9%86-pug-d65mrrsrlwv3</link>
                <description>درود بر شما عزیزان، در روز سی و یکم از چالش و در ادامه مبحث Node.js رفتم سراغ موتور قالب حرفه ای PUG.به طور کلی وظیفه موتور های قالب (Template Engines)، جایگزینی مقادیر دریافت شده از سمت سرور که توسط Controller در اختیار موتور قرار میگیرد، در قالب (Template) می باشد. برای زبان های برنامه نویسی سمت سرور، موتورهای قالب فراوانی نوشته شده است. نود هم از این قاعده مستثنی نیست و از بین چند موتور قالب مطرح و کاربردی، PUG یکی از بهترین ها برای Node.js است. این موتور دارای ویژگی های قدرتمندی مانند شرط ها، حلقه ها، include ها، mixin هاست که با استفاده از آن ما می توانیم کد HTML را بر اساس ورودی کاربر یا داده های مرجع ارائه دهیم.کار با آن نیز بسیار ساده هست. برای مثال قطعه کد زیر که با PUG نوشته شده است:بعد از ترجمه به HTML به قطعه کد زیر تبدیل می شود:امیدوارم از کار کردن با این موتور قالب لذت ببرید.شاد و سرافراز باشید. https://virgool.io/@mohstarsos1/%D8%B4%D8%B1%D9%88%D8%B9-%DA%86%D8%A7%D9%84%D8%B4-%DB%B1%DB%B0%DB%B0-%D8%B1%D9%88%D8%B2-%DA%A9%D8%AF-%D8%B2%D8%AF%D9%86-fxbkp0t9btcy </description>
                <category>Node.js</category>
                <author>Mohammad Ghasemi</author>
                <pubDate>Sat, 20 Jul 2019 08:21:22 +0430</pubDate>
            </item>
                    <item>
                <title>5 فریمورک nodejs که بهره وری کدتان را افزایش میدهند</title>
                <link>https://virgool.io/nodejs/5-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-nodejs-%DA%A9%D9%87-%D8%A8%D9%87%D8%B1%D9%87-%D9%88%D8%B1%DB%8C-%DA%A9%D8%AF%D8%AA%D8%A7%D9%86-%D8%B1%D8%A7-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D9%85%DB%8C%D8%AF%D9%87%D9%86%D8%AF-i08fnvofjjqw</link>
                <description> نود جی اس یک فریمورک متن باز (Open-source) چند سکویی و Runtime جاوااسکریپتی است که به کمک آن سمت سرور یک پروژه را می توان توسعه داد. این پلتفرم از موتور جاوااسکریپتی V8 گوگل کروم برای تبدل کدهای جاوااسکریپت به کد ماشین استفاده می کند به همین دلیل از سرعت بالایی برخوردار می باشد.فریمورک ها سکوهایی برای توسعه برنامه های نرم افزاری می باشند که استفاده از آنها یک چارچوب استاندارد جهت توسعه پایدارتر برنامه ها را دراختیار برنامه نویس قرار می دهد. همچنین فریمورک های nodejs در سطحی گسترده امکان کار بر روی نرم افزار ها با توجه به منطق کسب و کار آن نرم افزار را فراهم می آورد. می توان پیشبینی کرد چشم انداز آینده nodejs پیشرفت چشم گیر برنامه های کاربردی و تکنولوژی های توسعه وب باشد.اما همیشه سوالاتی مطرح می شود که شاید به نوعی واقعا عذاب آور باشد اینکه بهترین فریمورک سال 2019 کدام است و اینکه از کدام یک بهتر است استفاده کنم و کدام یک از فریمورک ها با توجه به نیازی های پروژه ام مناسب است؟این سوالات مثل این است که بگوید چه لباسی بپوشم و خب این بستگی به جایی که شما می خواهید بروید دارد!در این مقاله تمامی جوانب مثبت و منفی هر یک از فریمورک ها را بررسی کرده ایم تا برای هر دو گروه یعنی برنامه نویس و در نهایت کاربر مناسب باشد و از طرفی معیار انتخاب ما از 5 فریمورکی که قرار است با هم مورد بررسی قرار دهیم سهم هر یک از آنها در جامعه Github می باشد. اما معیارهای دقیق تر برای این انتخاب چیست ؟به برنامه نویسان سمت سرور این امکان را دهد تا سریع و مقیاس پذیر یک سیستم را توسعه دهند. : جمله بالا به موارد زیر اشاره دارددر برگیرنده مدل event-base I/O باشدساختار پیچیده ای نداشته و سبک باشدمبتنی بر single-thread Asynchronous باشد. در نظر داشته باشید که “سریع “بود تنها به بارگیری صفحات و انجام فرآیندها اشاره ندارد بلکه منظور سرعت توسعه فرآیندها نیز می باشد.به طوری که برنامه نویسی که سمت سرور را با nodejs پیاده سازی می کند دیگر نیازی به آشنایی و یادگیری دو یا چند زبان ندارد و با دانستن js می تواند هم back-end و هم front-end را توسعه دهد. به نوعی می توان یک فریمورک را نوعی طراحی انتزاعی از ساختار NodeJS دانست که اسکلت یا همان بنای توسعه برنامه هایی است که برنامه نویس در تمامی بخش های آن نگرش خود را پیاده سازی می کند.منظور از اسکلت مجموعه ای از ابزار ها، دستورالعمل ها و شیوه ها که می تواند به شما در توسعه و ارائه نمونه اولیه کمک کند. فریمورک ها به طور کلی باید دو ویژگی اساسی را داشته باشند : افزایش بهره وری و افزایش مقیاس پذیری  انواع فریمورک های nodejs :فریمورک های نود جی اس را می توانیم در سه بخش طبقه بندی کنیم :Model view controller frameworksFull stack frameworksREST API frameworks نوع اول این امکان را به شما می دهد تا با استفاده از مدل MVC ساختار پروژه تان را برای توسعه پایدار و سریع آماده کنید. از جمله فریمورک هایی که در این ردیف قرار می گیرند می توان به ExpressJS،SailsJS،HapiJS اشاره کرد. در این نوع فریمورک ها یعنی فریمورک هایی با ساختار MVC شما حق انتخاب های زیادی دارید مثل اینکه می توانید موتور قالب (Template Engine) خود را تغییر دهید به چیزی که به آن نیاز دارید. فریمورک های نوع دوم شما یک ساختار از قبل توسعه داده شده را در اختیار دارید مانند template engine و sockets و …  و فریمورک های نوع سوم شما باید یک چارچوب یا به عبارتی یک API تولید کنید تا بتوانید فریمورک را مورد استفاده قرار دهید. 1- ExpressJS : یک فریمورک یا بهتر است بگویم یک مینی فریمورک است که اگر تا این لحظه با nodejs کار کرده باشید مطمئنا با این فریمورک آشنایید و یا به احتمال زیاد تا حدودی با آن کار کرده اید. فریمورکی است که نقش یک میان افزار (middleware) را بین سرور و روت ها (Route) اجرا می کند و توسط بسیاری از شرکت های مورد استفاده قرار گرفته است.و به مراتب عملکرد قابل قبولی دارد که این شرکت ها اقدام به نگهداری و توسعه هر چه بیشتر کسب و کار خود با این فریمورک می کنند. توسعه API های قدرتمند توسط این فریمورک شاید اصلی ترین دلیل برای افزایش محبوبیت آن در سال 2019 باشد و این توسعه دهنگان را قادر می سازد تا با تعریف مسیرهایی بتوانند داده ها را بین دیتابیس و بخش front-end پروژه جا به جا کنند. اگر قصد دارید کار خود را با نود جی اس و البته فریمورک express شروع کنید می توانید از طریق پکیج منیجر NPM این کار را انجام دهید :  نصب express :  npm insatall express  نمونه کد :  const express = require(&#039;express&#039;); 
 const app = express(); 
 app.get(&#039;/&#039;, function (req, res) {
  res.send(&#039;Hello World&#039;)
   }); 
  app.listen(3000);  2- MetoerJS : یک فریمورک چند سکویی (cross-platform) و از نوع دوم فریمورک هایی که قبل تر ذکر شد می باشد. و دلیل قرار گیری این فریمورک در لیست 5 فریمورک برتر آپدیت لحظه به لحظه آن است و این امکان را می دهد که برنامه های که در قالب وب توسعه داده اید را بتوانید بر روی پلتفرم های موبایلی اجرا کنید.اما اگر قصد استفاده از این فریمورک را دارید باید بدانید که از دیتابیس mongoDB پشتیبانی نمی کند. 3-  KoaJS : این فریمورک به عنوان چارچوب نسل بعدی ساخته شده توسط تیم express می باشد. این فریمورک تا حد زیادی بر روی چارچوب های استاندارد ES6 متمرکز است مانند async/await به این دلیل که این فریمورک در جهت مدیریت هرچه بهتر errorها از طریق کنترل callback ها به واسطه معماری ویژه و خاص ES6 گام برداشته است. 4- SailsJS : فریمورکی که بر روی توسعه برنامه های تحت وب تمرکز دارد به طوری که به طور گسترده ای از پایگاه های داده مختلفی پشتیبانی می کند همچنین می تواند به صورت ساخت یافته ای یک API ایجاد کند و با هر معماری فرانت-اند ترکیب شود.این فریمورک زمانی که نیاز دارید یک پروژه را در بازه زمانی دقیق توسعه و ارائه دهید پیشنهاد می شود. 5- LoopBackJS : اگر نیاز دارید که یک پروژه را بر اساس REST API ها گسترش دهید می توانید از این فریمورک استفاده کنید.این فریمورک توسط IBM توسعه داده می شود و مورد استفاده در بیش از 500 شرکت معتبر می باشد از جمله بانک آمریکا (Bank of America). مواردی که ذکر شد نمونه ای از فریمورک هایی بود که در حوزه پلتفرم NodeJS می توان از آنها استفاده کرد هرچند که فریمورک هایی نظیر HapiJS,AdoniJS,NestJS نیز هستنند که می توانید اطلاعات کافی را درباره آن ها از منابع مختلف بدست آورید. سخن پایانی :استفاده از NodeJS و البته فریمورک های آن در بک-اند بی شک باعث افزایش کارایی و البته صرفه جویی در زمان خواهد شد اما شما کدام یک را انتخاب می کنید؟ این کاملا به نیاز شما بستگی دارد. اگر از من بپرسید در صورتی که بخواهم توسعه یک پروژه را در سریع ترین زمان و تمیز ترین شکل ممکن انجام دهم از SailsJS استفاده می کنم ولی اگر بخواهم رو حالت های مختلفی که قرار است شخصا آنها را سفارشی سازی کنم قطعا ExpressJS را انتخاب خواهم کرد.</description>
                <category>Node.js</category>
                <author>reactapp.ir</author>
                <pubDate>Wed, 10 Jul 2019 08:51:40 +0430</pubDate>
            </item>
                    <item>
                <title>میانجی (Middleware) در Express JS</title>
                <link>https://virgool.io/nodejs/%D9%85%DB%8C%D8%A7%D9%86%D8%AC%DB%8C-middleware-%D8%AF%D8%B1-express-js-i8dxylkzst1f</link>
                <description>قبل از هر چیز ، Middleware چیست ؟به طور ساده به عنوان یک راه ورودی در نظر بگیرید که Request ها اول از همه باید از اینجا عبور کنند و سپس به Handler برسند.در Express برای اینکه بتوانیم یک middleware بنویسیم از متد زیر استفاده میکنیم :app.use(path,callbak)این متد یک پارامتر اختیاری (path) و یک پارامتر اجباری (callback) میگیرد.فرض کنید قصد داریم تا Date و Method و آدرس درخواست داده شده به سرور رو در جایی ثبت کنیم، برای این کار یک middleware قبل از تمام Route ها تعریف میکنیم : //instantiate the Express.js appapp.use(function(req, res, next) {
    console.log(&#039;%s %s — %s&#039;, (new Date).toString(), req.method, req.url);
    return next();
});
 //implement server routesاز طرف دیگر فرض کنید میخواهیم که این اتفاق فقط برای مسیرهایی که با الگوی admin/ شروع میشوند بیافتد، در این حالت از پارامتر اختیاری path استفاده میکنیم : //instantiate the Express.js appapp.use(&#039;/admin&#039;, function(req, res, next) {    console.log(&#039;%s %s — %s&#039;, (new Date).toString(), req.method, req.url);
    return next();
 });
....
app.get(&#039;admin/login&#039;, (req,res) =&gt; {
    // TODO
});حال هر درخواستی که از مسیر /admin گذر کند اول این لاگ چاپ میشود.میدلویر ها کاربردهای زیادی دارند به طور مثال میتوان از آنها برای محدود کردن سطوح دسترسی استفاده کرد.</description>
                <category>Node.js</category>
                <author>حسام جعفرزاده</author>
                <pubDate>Wed, 26 Jun 2019 19:35:46 +0430</pubDate>
            </item>
                    <item>
                <title>مقدمه ای بر اکسپرس جی اس</title>
                <link>https://virgool.io/nodejs/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%A7%DA%A9%D8%B3%D9%BE%D8%B1%D8%B3-%D8%AC%DB%8C-%D8%A7%D8%B3-f389tbbyz8w0</link>
                <description>Express JSاکسپرس جی اس چیست ؟ یک وب فریم ورک است که برپایه ی Node_js# ساخته شده است و از آنجا که ساختن دوچرخه از ابتدا کار عاقلانه ای نیست و بهتر است که همان دوچرخه ی ساخته شده را بهتر کنیم برای توسعه وب سایت با استفاده از تکنولوژی #node_js از این فریم ورک استفاده میکنیم.در اکپرس شما در انتخاب پکیج هایی که به آنها نیاز دارید مختار هستید و این انعطاف پذیری این فریم ورک را ارتقا میدهد. به طور مثال برای انتخاب یک template engine دست شما کاملا باز است.هنگامی که یک برنامه‌ی Express اجرا میشود، express به درخواست های شما گوش میدهد و وضعیت انطباق هر در خواست شما را  با Route و middleware ها به ترتیب خطوط نوشته شده از بالا به پایین بررسی میکند.بررسی از بالا به پایین یکی از جنبه های مفید express است که به شما اجازه میدهد تا کنترل بیشتری بر روی جریان داده ها داشته باشید.به طور مثال‌:parse کردن کوکی هاparse کردن پارامتر های Routeدریافت اطلاعات احراز هویت از دیتابیس.ایجاد برنامه‌ی Hello World در پست های بعدی.#express#js#node</description>
                <category>Node.js</category>
                <author>حسام جعفرزاده</author>
                <pubDate>Sat, 22 Jun 2019 22:40:48 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی پکیج WordsNinja برای Node.js</title>
                <link>https://virgool.io/nodejs/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%BE%DA%A9%DB%8C%D8%AC-wordsninja-%D8%A8%D8%B1%D8%A7%DB%8C-nodejs-kteqyoplwwtg</link>
                <description>در حال توسعه سرویسی هستم که نیاز هست واژه‌های انگلیسی که بدون هیچ جداکننده‌ای در دیتاست قرار دارند رو به صورت واژه‌های تفکیک شده داشته باشم.توسعه محصول برپایه Node.js هست و خب این مشکلی بود که لازم بود حل بشه، در جستجویی که داشتم به لینک زیر رسیدم: https://stackoverflow.com/questions/8870261/how-to-split-text-without-spaces-into-list-of-words نمونه کدهایی به زبان پایتون و جاوااسکریپت به همراه فایلی حاوی کلمات انگلیسی در این پست بود که به من برای حل مشکلم کمک کرد. (از خوبی‌های فعالیت در جامعه متن‌باز ?)با استفاده از کد جاوااسکریپتی که در پست بود و بهینه‌سازی و توسعه اون پکیج npmی ایجاد کردم که برای پروژه‌های آینده کاربرد داشته باشه.نام پکیج wordsninja هست که نحوه استفاده از اون رو توضیح میدم. https://github.com/parsakafi/wordsninja نصب پکیجnpm install wordsninja --saveفراخوانی پکیج و ایجاد objectconst WordsNinjaPack = require(&#039;wordsninja&#039;); 
const WordsNinja = new WordsNinjaPack();برای استفاده نیاز هست ابتدا دیکشنری واژه‌های انگلیسی رو ایجاد کنید که با دستور زیر فرخوانی خواهد شد (خروجی این متد از نوع Promise هست که نیاز هست متد برنامه شما به شکل Async باشد)await WordsNinja.loadDictionary();تفکیک واژه‌ها به کمک متد splitSentence انجام میشهlet string = &#039;youneedtolearnfromyourmistakes&#039;; 
let words = WordsNinja.splitSentence(string);
console.log(words);که چنین خروجی رو نمایش میده:[ &#039;you&#039;, &#039;need&#039;, &#039;to&#039;, &#039;learn&#039;, &#039;from&#039;, &#039;your&#039;, &#039;mistakes&#039; ]پارامترهای اختیاری متد splitSentence به شما برای ایجاد خروجی بهتر کمک میکندپارامتر  camelCaseSplitter: شروع تفکیک براساس Camel Caseپارامتر  capitalizeFirstLetter: تغییر حروف ابتدای واژه‌ها به حروف بزرگ پارامتر  joinWords: برای ایجاد واژه‌ها به شکل پیوسته نمونه کاملی از نحوه استفاده(async () =&gt; {
 await WordsNinja.loadDictionary(); // First load dictionary
 let string = &#039;youneedtolearnfromyourmistakes&#039;;
 let words = WordsNinja.splitSentence(string,
        {
            camelCaseSplitter: true,  // Frist camel case spliting
            capitalizeFirstLetter: true,  // Capitalize first letter of result
            joinWords: true // Join words
        }
    );
 console.log(words);
})();خروجیYou Need To Learn From Your Mistakesافزودن واژه به دیکشنری در زمان اجراهمچنین می‌توانید قبل از اجرای متد تفکیک واژه‌ها از متد addWords برای افزودن واژه(ها) به دیکشنری استفاده کنید، نمونه:WordsNinja.addWords(&#039;Parsa&#039;);  // Add one word
WordsNinja.addWords([&#039;Parsa&#039;, &#039;Kafi&#039;]); // Add one or more wordsلینک پکیج در npm https://www.npmjs.com/package/wordsninja امیدوارم برای شما به هر شکل کاربردی باشه :)</description>
                <category>Node.js</category>
                <author>پارسا</author>
                <pubDate>Fri, 21 Jun 2019 00:49:21 +0430</pubDate>
            </item>
                    <item>
                <title>با Proxy Chain آشنا شوید</title>
                <link>https://virgool.io/nodejs/%D8%A8%D8%A7-proxy-chain-%D8%A2%D8%B4%D9%86%D8%A7-%D8%B4%D9%88%DB%8C%D8%AF-juxi8xstfcjl</link>
                <description>یک پیاده سازی تمیز به زبان JavaScript از پروکسی سرور (چیزی شبیه به Squid) با پشتیبانی از SSL، احراز هویت، زنجیره سازی پروکسی و امکان برنامه نویسی برای ایجاد تغییر در HTTP Header ها یا اندازه گیری ترافیک مصرفی و ...Proxy Chainچرا به پروکسی نیاز دارید؟هنگامی که امکان استفاده از سرویس VPN وجود ندارد و شما نیاز به برقراری ارتباط با بیرون از شبکه دارید می‌بایست از پروکسی استفاده کنید. برای مثال قصد دانلود ویدیو از یوتیوب روی سرورهای سایت جعبه که در شاتل میزبانی می‌شود.راه اندازی Proxy Chainراه اندازی proxy-chain مثل آب خوردن است.پروژه جدید ایجاد کنید: https://docs.npmjs.com/cli/initفایل proxy.js با محتوای توضیح داده شده در این آدرس ایجاد کنید: https://www.npmjs.com/package/proxy-chain#run-a-simple-httphttps-proxy-serverپورت مورد نظر را در firewall باز کنید.مطمئن شوید در سیستم عامل شما Nameserver ها درست تنظیم شده باشند.پروژه را start کنید.const ProxyChain = require(&#039;proxy-chain&#039;); 
const server = new ProxyChain.Server({ port: 8000 }); 
server.listen(() =&gt; {
    console.log(`Proxy server is listening on port ${8000}`);
});</description>
                <category>Node.js</category>
                <author>محمدعلی اکبری</author>
                <pubDate>Wed, 12 Jun 2019 13:44:24 +0430</pubDate>
            </item>
                    <item>
                <title>مشکلات امنیتی رایج استفاده جاوااسکریپت در بک اند</title>
                <link>https://virgool.io/nodejs/%D9%85%D8%B4%DA%A9%D9%84%D8%A7%D8%AA-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%D8%B1%D8%A7%DB%8C%D8%AC-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AC%D8%A7%D9%88%D8%A7%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%AF%D8%B1-%D8%A8%DA%A9-%D8%A7%D9%86%D8%AF-pdbn0lcgnwoi</link>
                <description>finance-monthlyامروز جاوااسکریپت فقط در فرانت استفاده نمی شود و استفاده از جاوا اسکریپت در بک اند توسط runtime هایی همچون nodejs متداول شده است.در این مطلب میخواهیم مشکلاتی که اغلب خود برنامه نویسان در بک اند به وجود می آورند را بررسی کنیم.انواع Injectionدر این نوع attack ها سعی ما بر این است از جاهایی که توسعه دهنده مقادیر ورودی را کنترل نکرده است مقادیر خودمان را وارد کنیم.۱- تزریق SQL/noSQL injectionمثال noSQLدر مثال ما پایگاه داده مورد استفاده ما mongodb است.در این پایگاه داده متغیر هایی مانند ne$(به معنی نابرابر) و gt$( به معنی بزرگتر) که می توان از آن ها سوء استفاده کرد.همین موضوع کافی است تا در query که از ما گرفته میشود به جای مقدار درخواست شده متغیر ne$  یا gt$ بگذاریم.برای مثال در json زیر ایمیل و کلمه عبور از ما گرفته می شود و با مدل User چک می شود، کافی است به جای مقدار واقعی payload خود را بگذاریم.{
&quot;email&quot;: {&quot;$gt&quot;: &quot;&quot;}, 
&quot;password&quot;: {&quot;$gt&quot;: &quot;&quot;}
}این مقدار ها باعت می شود دیتابیس هر مقداری را که بزرگتر از &quot;&quot; را برگرداند و این موضوع یعنی اینکه همه کاربرانی که ایمیل و کلمه عبورشان بزرگتر از &quot;&quot; میتواند منظور query ما باشد.حالا نگاهی به کد آسیب پذیر بی اندازیم:app.post(&#039;/login&#039;,function(req,res){    User.findOne({&#039;email&#039;:req.body.email,&#039;password&#039;:req.body.password},function(err,data){        if(err){            res.send(err);        }else if(data){            res.send(&#039;User Login Successful&#039;);        }else {            res.send(&#039;Wrong Username Password Combination&#039;);        }    })});توسعه دهنده بدون هیچ input validation مقادیر ایمیل و پسورد را از کاربر می گیرد کد بهبود یافته مانند زیر می شود:app.post(&#039;/login&#039;,function(req,res){    var email = req.body.email;    var password = req.body.password;    User.findOne({&#039;email&#039;: { $in: [email] },&#039;password&#039;: { $in: [password] }},function(err,data){        if(err){            res.send(err);        }else if(data){            res.send(&#039;User Login Successful&#039;);        }else {            res.send(&#039;Wrong Username Password Combination&#039;);        }    })});بهبود فقط با اضافه شدن in$ به این معنی که مقدار فرستاده شده کاربر اگر در آرایه مقادیر بود مقدار True برگردان.توضیحات بیشتر در scotch.io مثال SQLفرض کنید توسعه دهنده نام کاربری را به این شکل در query خود قرار می دهد.SELECT * FROM users WHERE username = &#039;&quot; + username + &quot;&#039;;خب ما میتوانیم داخل username این payload را قرار دهیم&#039; OR &#039;1&#039;=&#039;1&#039;;یعنی query را ببندیم و مقدار ۱=۱ را قرار دهیم تا query توسط ما True شود.اگر هم بعد از username مقادیر دیگری هم مانند مثال زیر گرفته می شود کافی است بقیه query را کامنت کنیم.SELECT * FROM users WHERE username = &#039;&quot; + username + &quot;&#039; and password = &#039;&quot; + password + &quot;&#039;;پس &#039; OR &#039;1&#039;=&#039;1&#039;;--برای بهبود کد می توان به جای اینکه مستقیم مقدار کاربر را در query قرار داد آن را توسط کتابخانه pg از کاربر گفت.توضیحات بیشتر به همراه آموزش تست توسط sqlmap در nearform.comمثال جالب دیگر برای دور زدن Authentication در medium۲- تزریق Command Injectionتوابعی مثل ()eval، setTimeout()، setInterval()، Function() که مقادیری را از کاربر می توانند بگیرند اگر دستوراتی مانند:while(1)process.exit()process.kill(process.pid) بگیرند باعث حملات تکذیب سرور یا Denial of Service شود.البته می توان فایل های سیستمی یا دایرکتوری ها را نیز هم با این Attack احتمالا خوانددستوراتی مانند: res.end(require(&#x27;fs&#x27;).readdirSync(&#x27;../..&#x27;).toString()) res.end(require(&#x27;fs&#x27;).readFileSync(&#x27;../../../../../../../../../../etc/passwd&#x27;)) کد آسیب پذیر:var cmd = eval&#40;req.body.cmd&#41;;کد بهبود یافته:var cmd = parseInt(req.body.cmd);توضیحات بیشتر در کتابچه nodegoat۳- حملات XXEفرض کنید قرار است اطلاعاتی را از کاربر در قالب xml بگیرید مانند کد زیر var products = libxmljs.parseXmlString(req.files.products.data.toString(&#039;utf8&#039;), {noent:true,noblanks:true})به صورت پیش فرض کتابخانه libxmljs می تواند فایل های اکسترنال را هم فراخوانی کنید و ما هم از این فرصت استفاده می کنیم و یک entity تعریف می کنیم و ارسال می کنیم:&lt;!DOCTYPE foo [&lt;!ELEMENT foo ANY &gt;&lt;!ENTITY bar SYSTEM &quot;file:///etc/passwd&quot; &gt;]&gt;&lt;products&gt;   &lt;product&gt;      &lt;name&gt;Playstation 4&lt;/name&gt;      &lt;code&gt;274&lt;/code&gt;      &lt;tags&gt;gaming console&lt;/tags&gt;      &lt;description&gt;&amp;bar;&lt;/description&gt;   &lt;/product&gt;&lt;/products&gt;عملا باید بتوانیم محتوا فایل passwd را بخوانیم.کد بهبود یافته: var products = libxmljs.parseXmlString(req.files.products.data.toString(&#039;utf8&#039;), {noent:false,noblanks:true})توضیحات بیشتر در کتابچه appsecco۵-حملات Insecure Deserializationاول از همه نگاهی به payload اتک بی اندازیم:{&quot;rce&quot;:&quot;_$$ND_FUNC$$_function (){require(&#039;child_process&#039;).exec&#40;&#039;id;cat /etc/passwd&#039;, function(error, stdout, stderr&#41; { console.log(stdout) });}()&quot;} با این payload می توانیم محتوا passwd را بخوانیم! چطور؟اگر موقع deserialization کردن مانند کد زیر به صورت نا امن deserialization بکنیم این آسیب پذیری به وجود می آید: var products = serialize.unserialize(req.files.products.data.toString(&#039;utf8&#039;))کد بهبود یافته می تواند مانند زیر باشد:var products = JSON.parse(req.files.products.data.toString(&#039;utf8&#039;))توضیح بیشتر در کتابچه appseccoمنابعSlideShareAppseccoBaweTechمعذرت بابت کم و کاستی های فراوان این مطلب خیلی خوشحال میشوم نظرات خود را اینجا بگذاریدبا تشکر از شما</description>
                <category>Node.js</category>
                <author>rezaduty</author>
                <pubDate>Tue, 14 May 2019 21:50:54 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ساخت ربات فرمان صوتی بر پایه هوش مصنوعی با Nodejs</title>
                <link>https://virgool.io/nodejs/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%B1%D8%A8%D8%A7%D8%AA-%D9%81%D8%B1%D9%85%D8%A7%D9%86-%D8%B5%D9%88%D8%AA%DB%8C-%D8%A8%D8%B1-%D9%BE%D8%A7%DB%8C%D9%87-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D8%A7-nodejs-o2gsbbss7fvv</link>
                <description> استفاده از فرمان صوتی این روز ها خیلی فراگیر تر شده و تقریبا اکثر افراد از دستیار های صوتی موجود در تلفن همراهشون نظیر Siri  و Cortana استفاده میکنند .همچین غول های بزرگ صنعت IT هم از این به روز رسانی عقب نموندن و سرویس ها و سخت افزار هایی نظیر Amazon Echo  و GoogleHome  رو ساختند.این سرویس ها اکثرشون قابلیت اتصال به سیستم تشخیص گفتار یا Speech recognition رو دارند و می تونند از طریق فرمان صوتی متن گفته شده شما رو تشخیص بدند و حتی جواب رو هم در قالب گفت و گو و محاوره با شما درمیون بذارند .اما…اما نکته جالب اینجاست که شرکت هایی نظیر گوگل و موزیلا دارند سعی می کنند تمامی این خدمات رو در قالب اجرای یک برنامه تحت وب و روی مرورگر به شما تحویل بدند . به عنوان مثال پردازش تصویر که اگه سرچ بزنید احتمالن پروژه شو پیدا خواهید کرد .یا اینجا رو ببینید.توی این آموزش ما می خواهیم که یک صفحه وب داشته باشیم که کاربر با زدن یک دکمه بتونه حرف خودش رو به صورت کلامی بزنه و جواب رو هم به صورت گفتار بشنود.این نکته رو بدونید که سیستم تشخیص گفتار به صورت خودکار روی اکثر مرورگر ها نصبه و ما از خود api  های مرورگر که کدهای جاوا اسکریپت هست استفاده میکنیم تا حرف های گفته شده کاربر رو تشخیص بدیم .البته این سیستم تشخیص گفتار مرورگر ها هنوز در نسخه آزمایشی به سر میبره و در شکل زیر می تونید ببینید که توسط چه ورژن هایی از مرورگر ها پشتیبانی میشه. نکته: فعلا مرورگر هایی نظیر IE و Safari و Mozilla فقط و فقط از سیستم سنتز گفتگو یا speech synthesis پشتیبانی میکنند و این یعنی فقط می تونند جواب یا متن رو براتون بخونند .این قابلیت رو به صورت شکل بالای آیکون هر مرورگر دیده میشه . (عکس بالا)ویدیو زیر یک مثال کوچولو از چیزیه که ما قراره بسازیم . https://www.aparat.com/v/Y9G3I برای ساخت یک چنین چیزی نیاز به سه مرحله کار داریم .1- استفاده از api تشخیص گفتار مرورگر برای شنیدن گفتار و تبدیل آن به متن مورد نظر (SpeechRecognition )2- فرستادن متن مورد نظر به یکی از سرویس های هوش مصنوعی رایج به کمک nodejs  و دریافت جواب (در اینجا ما از سرویس گوگل که اسمش API.AI هست استفاده میکنیم)3- تبدیل جواب دریافت شده به صوت یا همون خوندن متن با api های داخلی مرورگر (SpeechSynthesis)اگه کمی درکش سخته میتونید به عکس زیر نگاه کنید تا متوجه این سه قسمت بالا بشید. خب تمام سوروس کد رو  میتونید از اینجا دریافت کنید.اما برسیم به بخش توضیح پیاده سازی و پیش نیاز های این آموزش:این آموزش برپایه nodejs نوشته شده و شما باید یه حداقل هایی رو از nodejs و javascript بلد باشید تا راحت تر کد هارو درک کنید.پیاده سازی کد:ابتدا یک فولدر درست کنید و با دستور زیر فایل package.json رو به پروژه تون اضافه کنید . npm init --yes  سپس داخل پوشه ساخته شده فایل های مورد تظر رو طبق ساختار درختی زیر ایجاد کنید. .├── index.js
├── public
│       ├── css
│       │   └── style.css
│       └── js
│       └── script.js
└── views
    └── index.html سپس با دستور npm اقدام به نصب ماژول های مورد نیاز خودمون برای نوشتن برنامه سمت سرور می کنیم. npm install express socket.io apiai --save این فرمان علاوه بر دانلود ماژول های مورد استفاده ، ورژن و نوع برنامه نصب شده رو در فایل package.json قرار میده تا برای استفاده های بعدی به مشکل نخورید.توضیح بدم که express یک framework هست که بر مبنای معماری MVC کار میکنه و وظیفه اش اجرای صفحات وب برای کاربر ها و نوشتن route هستش .البته خیلی بیشتر از این حرفاست و واقعا express محشره و اکثر برنامه نویس های nodejs از این ماژول استفاده میکنند.مورد بعدی socketIO هست که ما نصبش کردیم . این کتابخونه در حقیقت وظیفه ارسال و دریافت پیام از صفحه مرورگر ما به سمت سرور رو به صورت realTime بر عهده داره و دیگه نیازی به refresh صفحه وب نخواهد بود . البته از ajax و یا fetch هم میشه برای فرستادن پیام در قالب GET یا POST استفاده کرد ولی این بهترین راهه.نکته:این socketIO که اینجا نصبش کردیم فقط و فقط وظیفه سمت سرور رو انجام میده و برای سمت کلاینت از نسخه CDN این کتابخونه استفاده خواهیم کرد.تا ارتباط دوطرفه بین سرور ما و صفحه وب از طریق socketIO برقرار بشه.مورد بعدی ماژول apiai هست که کتابخونه ای جهت برقراری ارتباط با سرور های هوش مصنوعی گوگل هست. در حقیقت ما متنی که از مرورگر دریافت کردیم به سرور خودمون میفرستیم و سپس اون متن رو به سرور گوگل انتقال میدیم تا سرور گوگل اونو آنالیز کنه و جواب متناسب رو برگردونه و در نهایت ما اون جواب رو با socketIO به مرورگر کلاینت مون انتقال میدیم.اگه مطالب گفته شده بالا کمی گُنگ بود به عکس زیر نگاه کنید تا کاملا مفهومش رو درک کنید. من کد ها رو به ترتیب میذارم و خیلی توضیح نمیدم چون خیلی ساده هستند و نیازی به توضیح نداره.توضیح بیشتر فقط خسته تون میکنه.کد اول index.js در حقیقت این کد اجرا میشه و وب اپلیکیشن ما آماده کار میشه.const APIAI_TOKEN = &quot;&quot;;
const APIAI_SESSION_ID = &quot;&quot;;
const express = require(&#039;express&#039;);
const app = express();
app.use(express.static(__dirname + &#039;/views&#039;)); // html
app.use(express.static(__dirname + &#039;/public&#039;)); // js, css, images
const server = app.listen(process.env.PORT || 5000, () =&gt; {
        console.log(&#039;Express server listening on port %d in %s mode&#039;, server.address().port,
        app.settings.env);
        });
        
const io = require(&#039;socket.io&#039;)(server);
io.on(&#039;connection&#039;, function(socket){
        console.log(&#039;a user connected&#039;);
 });
        
const apiai = require(&#039;apiai&#039;)(APIAI_TOKEN);

// Web UI
app.get(&#039;/&#039;, (req, res) =&gt; {
        res.sendFile&#40;&#039;index.html&#039;&#41;;
});
io.on(&#039;connection&#039;, function(socket) {
        socket.on(&#039;chat message&#039;, (text) =&gt; {
                console.log(&#039;Message: &#039; + text);
                
                // Get a reply from API.ai
                let apiaiReq = apiai.textRequest(text, {
                        sessionId: APIAI_SESSION_ID
                        });
                  apiaiReq.on(&#039;response&#039;, (response) =&gt; {
                  let aiText = response.result.fulfillment.speech;
                  console.log(&#039;Bot reply: &#039; + aiText);
                  socket.emit(&#039;bot reply&#039;, aiText);
                  });
               apiaiReq.on(&#039;error&#039;, (error) =&gt; {
               console.log(error);
               socket.emit(&#039;bot reply&#039;, &quot;we get error sir&quot;);
               });
       
               apiaiReq.end();
         });
}); دقت داشته باشید که دو خط اول از این کد نیاز به وارد کردن اطلاعات ثبت نامی شما در سایتAPI.AI  هستش که البته گوگل ایران رو تحریم کرده.اما نحوه ساخت حساب کاربری در این سایت راحته شما واردش بشید و یک حساب بسازید برای اطلاعات بیشتر به اینجا مراجعه کنید.پس از ساخت حساب بر روی گزینه “Small Talk” برید و اون دکمه تغییر وضعیت یا toggle اش رو روشن کنید . عکس زیر بیشتر توضیح میده. بعد از این کار به قسمت “General Settings” برید (همون آیکون چرخ دنده) و در اونجا برای APIAI_TOKEN خودتون که توی کد برنامتون بود مقدار “client access token”کپی کنید و در کد قرار بدید توی این قسمت (index.js)const APIAI_TOKEN = &quot;&quot;; در قسمت زیر هم یک نام دلخواه رو جای گذاری کنید (index.js) const APIAI_SESSION_ID = &quot;&quot;; همین حالا بقیه کد ها رو به ترتیب میذارمindex.html&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
   &lt;meta name=&quot;description&quot; content=&quot;Simple AI&quot;&gt;
   &lt;meta name=&quot;author&quot; content=&quot;niki&quot;&gt;
   
   &lt;title&gt;Simple AI Demo with Web Speech API&lt;/title&gt;
   &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/fontawesome/4.7.0/css/font-awesome.min.css&quot;&gt;
   &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
   &lt;section&gt;
      &lt;h1&gt;Simple AI Bot&lt;/h1&gt;
      &lt;h2&gt;with Web Speech API&lt;/h2&gt;
      &lt;button&gt;&lt;i class=&quot;fa fa-microphone&quot;&gt;&lt;/i&gt;&lt;/button&gt;
      &lt;div&gt;
         &lt;p&gt;You said: &lt;em class=&quot;output-you&quot;&gt;...&lt;/em&gt;&lt;/p&gt;
         &lt;p&gt;Bot replied: &lt;em class=&quot;output-bot&quot;&gt;...&lt;/em&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/section&gt;
    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js&quot;&gt;      
    &lt;script src=&quot;js/script.js&quot;&gt;
&lt;/body&gt;
&lt;/html&gt; script.js // &#039;use strict&#039;;
const socket = io();
const outputYou = document.querySelector(&#039;.output-you&#039;);
const outputBot = document.querySelector(&#039;.output-bot&#039;);
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();

recognition.lang = &#039;en-US&#039;;
recognition.interimResults = false;
recognition.maxAlternatives = 1;

document.querySelector(&#039;button&#039;).addEventListener(&#039;click&#039;, () =&gt; {
    recognition.start();
});

recognition.addEventListener(&#039;speechstart&#039;, () =&gt; {
     console.log(&#039;Speech has been detected.&#039;);
});

recognition.addEventListener(&#039;result&#039;, (e) =&gt; {
    console.log(&#039;Result has been detected.&#039;);
    let last = e.results.length - 1;
    let text = e.results[last][0].transcript;
    
    outputYou.textContent = text;
    console.log(&#039;Confidence: &#039; + e.results[0][0].confidence);
    
    socket.emit(&#039;chat message&#039;, text);
});

recognition.addEventListener(&#039;speechend&#039;, () =&gt; {
    recognition.stop();
});

recognition.addEventListener(&#039;error&#039;, (e) =&gt; {
    outputBot.textContent = &#039;Error: &#039; + e.error;
});

function synthVoice(text) {

    const synth = window.speechSynthesis;
    const utterance = new SpeechSynthesisUtterance();
    utterance.text = text;
    synth.speak(utterance);
}
socket.on(&#039;bot reply&#039;, function(replyText) {
    synthVoice(replyText);
    if(replyText == &#039;&#039;) replyText = &#039;(No answer...)&#039;;
    outputBot.textContent = replyText;
}); style.css * { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }

html {
    height: 100%;
}
body {
    padding: 0;
    margin: 0;
    font-family: &quot;HelveticaNeueLight&quot;, &quot;HelveticaNeue-Light&quot;, &quot;Helvetica Neue Light&quot;,
    &quot;HelveticaNeue&quot;, &quot;Helvetica Neue&quot;, &#039;TeXGyreHerosRegular&#039;, &quot;Helvetica&quot;, &quot;Tahoma&quot;, &quot;Geneva&quot;,
    &quot;Arial&quot;, sans-serif;
    font-weight: 300;
    /* background: #f7f7f7 url(../images/geometry.png) 0 0 no-repeat; */
    background-size: cover;
    color: #333;
}
footer {
    font-size: 0.75em;
    color: silver;
    position: fixed;
    bottom: 1em;
    left: 1em;
}
footer a {
    color: #f80;
}
header {
    margin: 2em 0;
    text-align: center;
}
h1, h2, h3 {
    margin: 0;
    text-rendering: optimizeLegibility;
    text-align: center;
    }
    h1 {
        font-weight: 400;
        font-size: 3em;
}
h2 {
    font-weight: 300;
    margin-top: 0.5em;
}
section {
    margin: 1.5em auto;
    width: 400px;
}
button {
    display: block;
    -webkit-appearance: none;
    -moz-appearance: none;
    width: 200px;
    height: 200px;
    border: 0;
    border-radius: 50%;
    padding: .7em 1em;
    margin: 4em auto 3em;
    text-align: center;
    color: #fff;
    background: linear-gradient(180deg, #39C2C9 0%, #3FC8C9 80%, #3FC8C9 100%);
    box-shadow: 2px 5px 30px rgba(63, 200, 201, .4);
    
    will-change: transform, filter;
    transition: all 0.3s ease-out;
}
button .fa {
    font-size: 130px;
    line-height: 200px;
    margin: 0;
    text-shadow: 1px 2px 2px #2a8b90;
}
button:hover {
    transform: scale(.92);
    }
button:active {
    filter: brightness(.8);
}
button:focus {
    outline: 0;
}
.fa {
    display: inline-block;
    font: normal normal normal 14px/1 FontAwesome;
    font-size: 1.3em;
    text-rendering: auto;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    margin-left: 10px;
}
.fa-github::before {
    content: &quot;\f09b&quot;;
} و خروجی برنامه پس از اجرا به این صورت خواهد بود.  در پایان می تونید با زدن کلید F12 در مرورگر خودتون خطاهای تولید شده رو رد گیری کنید.بازم به این نکته تاکیید می کنم که سیستم هوش مصنوعی گوگل برای ایرانی ها مورد تحریم واقع شده. پ.ن: باقی مطالب رو از www.nikitv.ir هم میتونید دنبال کنید. موفق باشید</description>
                <category>Node.js</category>
                <author>Niki</author>
                <pubDate>Mon, 29 Apr 2019 22:06:11 +0430</pubDate>
            </item>
                    <item>
                <title>اجرای دستورات ES6 در NodeJs همراه با NodeMon</title>
                <link>https://virgool.io/nodejs/%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-es6-%D8%AF%D8%B1-nodejs-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A8%D8%A7-nodemon-brxrxku3xoil</link>
                <description>NodeJs and Nodemonسلامامروز می خوام راجب کانفیک کردن پروژه جدید در NodeJs صحبت کنیم.ایجاد پروژه نود خیلی ساده هست و کار زیادی نداره و با یک دستور npm init همه چی حله.خب تا اینجا دستورات ES5 هست که اجرا می شن و اگر بخواهیم دستورات رو به صورت ES6 اجرا کنیم باید یکم تغییرات روی پروژه اجرا کنیم. این تغییرات ساده هستن و با دنبال کردن موارد زیر این کار را به راحتی انجام دهید.ابتدا babel  را به صورت زیر نصب کنید.npm install --save-dev babel-cli babel-preset-envبعد یه فایل با نام  زیر ایجاد کنید..babelrcداخل این فایل این مقدار را قرار دهید.{
  &quot;presets&quot;: [&quot;env&quot;]
}حالا جهت تست یه کد تستی روی رو در فایل index.js وارد می کنیم که از اجرای ES6 مطمئن بشیم.import http from &#039;http&#039;;
http.createServer((req, res) =&gt; {
  res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/plain&#039;});
  res.end(&#039;Hello World\n&#039;);
}).listen(3000);

console.log(&#039;Server running at http://localhost:3000/&#039;);حالا تغییرات زیر رو داخل فایل  package.json اعمال کنید. این تغییرات برروی scripts در فایل package.json اعمال می شود.&quot;scripts&quot;: {
   &quot;build&quot;: &quot;babel index.js -d dist&quot;,
   &quot;start&quot;: &quot;npm run build &amp;&amp; node dist/index.js&quot;
  }در نهایت npm start رو بزنید تا پروژه اجرا شود.تا اینجا همه چیز خوب پیش رفته. اما ما یه مشکل کوچیک داریم اینجا و اونم اینه که اجرای با تغییر بر روی فایل index.js باید یه بار سرور را متوقف و دوباره npm start  بزنیم. برای حل این مشکل و اینکه با هر تغییر سرور به صورت خودکار این تغییرات راه اعمال کند می تونید از nodemon استفاده کنید. استفاده از این ماژول بسیار راحت می باشد. ابتدا این ماژول را نصب نمایید.$ npm install -g nodemonحالا به دلیل اینکه ما کد رو با استاندارد ES6 نوشتیم تغییرات زیر را باید در Package.json اعمال کنیم تا همه چیز به درستی کار کند. ابتدا فایل index.js خود را درصورتی که در مسیر اصلی ساخته اید به پوشه ای با عنوان lib انتقال دهید و در صورتی که پکیج منیجر Yarn رو ندارید آن را دانلود ونصب نمایید سپس تغییرات زیر را اعمال نمایید.&quot;scripts&quot;: {
 &quot;build&quot;: &quot;babel lib/ -d dist/&quot;,
 &quot;watch&quot;: &quot;nodemon --watch lib --exec yarn start&quot;,
 &quot;start&quot;: &quot;yarn build &amp;&amp; yarn serve&quot;,
 &quot;serve&quot;: &quot;node dist/index.js&quot;
  }همه چیز آماده است با دستور yarn watch سیستم را راه اندازی و از اتوماتیک شدن تغییرات پروژه لذت ببرید.</description>
                <category>Node.js</category>
                <author>مصطفی سفاری</author>
                <pubDate>Thu, 25 Apr 2019 10:22:14 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی با nodejs/جلسه هشتم/ Node.js Events</title>
                <link>https://virgool.io/nodejs/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-nodejs%D8%AC%D9%84%D8%B3%D9%87-%D9%87%D8%B4%D8%AA%D9%85-nodejs-events-dby7uqphfhbq</link>
                <description>سلام دوستان , تو این جلسه میخایم با Events اشنا بشیم و روش استفاده ازش رو یاد بگیریم.اصلا Events چیه؟اگر بخایم Events رو ترجمه کنیم میشه &quot;رویداد&quot; و در واقع هر عمل و اتفاقی که تو کامپیوتر اتفاق میفته یک رویداد محسوب میشه.برای مثال وقتی یک connection صورت میگیره یا مثلا وقتی یک فایل باز میشه.آبجکت ها میتونند باعث وقوع یک رویداد بشن , یعنی چی؟یعنی مثلا آبجکت readStream وقتی یک فایل رو باز میکنه باعث میشه تا رویداد &quot;باز شدن فایل&quot; رخ بده.به مثال زیر توجه کنید: var fs = require(&#x27;fs&#x27;);var rs = fs.createReadStream(&#x27;./demofile.txt&#x27;);   rs.on(&#x27;open&#x27;, function () {  console.log(&#x27;The file is open&#x27;);   });  ماژول Eventsنود در داخل خودش یک ماژول درونی به اسم &quot; Events &quot; داره که هر جایی که خواستید یک event یا همون رویداد بسازید ( create a events ), یا به یک رویدادی گوش بدید( listen to events ) میتونید از این ماژول استفاده کنید, برای استفاده هم کافیه اون رو require کنید , دقت کنید که تمام Property ها و متدهای مورد استفاده در events یک نمونه یا instance از آبجکت EventEmitter هستند پس برای استفاده باید به صورت زیر عمل کنید: var events = require(&#x27;events&#x27;);var eventEmitter = new events.EventEmitter();   چه نیازی به Events داریم؟شاید این سوال به ذهنتون اومده باشه و بگید که چه نیازی به استفاده از events هست؟بزارید یه مثال ساده بزنم تا متوجه بشید.فرض کنید شما داخل برنامه تون از دیتابیس استفاده میکنید و میخاید وقتی که ارتباط با دیتابیس با موفقیت برقرار شد یک پیامی رو چاپ کنید, اینجاست که میتونید از events کمک بگیرید!دقت کنید استفاده از events به همچین چیز ساده ای محدود نمیشه و کاربردهای خیلی مهم تری داره که در ادامه باهاش آشنا میشید و این مثال صرفا جهت آشنایی شما بود.آبجکت EventEmitterشما میتونید با استفاده از آبجکت EventEmitter رویدادهای شخصی خودتون رو بسازید و ازشون استفاده کنید.در مثال زیر ما یک تابع به نام &quot; myEventHandler &quot; درست کردیم.وقتی که رویداد &quot; scream &quot; به وقوع می پیونده این تابع اجرا میشه.این به وقوع پیوستن رو به اصطلاح میگن fire شدندر خط آخر هم اومدیم و رویداد خودمون رو fire کردیم: var events = require(&#039;events&#039;);
var eventEmitter = new events.EventEmitter();
  
//Create an event handler:
var myEventHandler = function () {
    console.log(&#039;I hear a scream!&#039;);
}//Assign the event handler to an    event:
eventEmitter.on(&#039;scream&#039;, myEventHandler);//Fire the    &#039;scream&#039; event:
eventEmitter.emit(&#039;scream&#039;); امیدوارم از این آموزش هم لذت برده باشیدمنبع: www.w3schools.com</description>
                <category>Node.js</category>
                <author>IranForexTraders</author>
                <pubDate>Sun, 07 Apr 2019 11:28:46 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش استفاده از module.exports در node.js</title>
                <link>https://virgool.io/nodejs/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-moduleexports-%D8%AF%D8%B1-nodejs-yymdzdkfm5f2</link>
                <description>کجا از exports استفاده میکنیم؟قبلا اینجا با هم در مورد module صحبت کردیم و گریزی هم به استفاده از module.exports زدیم و قول دادم که نوشته ای مختص module.exports براتون آماده کنم که به قولم عمل کردم, خب بریم سر اصل مطلب:از export هنگامی استفاده می شود که ماژولی میسازیم و میخایم توابع و آبجکت های ماژول رو به بیرون از ماژول ارسال و در جایی دیگر از آنها استفاده کنیم.اگر نمیدونید ماژول چیه به این لینک مراجعه کنیدماژولها چگونه کد خود را با بقیه ماژولها به اشتراک میزارن؟هر ماژول درون خودش آبجکتی با نام module داره, این آبجکت اطلاعاتی مثل نام و id ماژول فعلی رو داخل خودش نگه میداره, همچنین این آبجکت یک property به نام exports داره که وظیفه ایشون اینه که مشخص کنه ماژول چه چیزهایی قراره با ماژولهای دیگه به اشتراک بزاره تا اونا با استفاده از import یا require بتونن ازش استفاده کنن. ما میتونیم هر نوع value, function یا object رو با استفاده از module.exports در اختیار ماژول های دیگه بزاریم و اونا استفاده کنند.خب فکر کنم الان قشنگ با module.exports آشنا شدین و بهتره که بریم روش استفاده از module.exports رو بهتون بگم.چگونه از module.exports استفاده کنیم؟همونطور که گفتم میتونیم هر نوع value, function, یا object رو export کنیم, حتما میپرسید چجوری؟ فرض کنید ما یک متغیر با نام temp داریم و قصد داریم که اون رو export کنیم, برای این کار فقط لازمه تا این متغیر رو به لیست propertyهای module.exports اضافه کنیم که کدش رو پایین براتون گذاشتم: let temp = 12
module.exports.temp = tempچگونه متغیر یا توابعی که exports کردیم را require کرده و استفاده کنیم؟خب تا اینجا ما یاد گرفتیم exports چی هست و چجوری باید ازش استفاده کنیم.اگر موافق باشید این جلسه رو با یه تمرین عملی به پایان برسونیم D:  فایلی به نام book_recommendations.js بسازید و کد زیر رو داخلش قرار بدید:// book_recommendations.js

// نویسنده های مورد علاقمون رو داخل یه متغیر قرار دادیم
const favoriteAuthor = { name: &quot;Ken Bruen&quot;, genre: &quot;Noir&quot;, nationality: &quot;Irish&quot; };

// این تابع کتاب مورد علاقمون رو برمیگردونه
function favoriteBook() { 
 return { title: &quot;The Guards&quot;, author: &quot;Ken Bruen&quot; };
}

// این تابع لیستی از کتابهای خوب رو برمیگردونه
function getBookRecommendations() { 
 return [
 {id: 1, title: &quot;The Guards&quot;, author: &quot;Ken Bruen&quot;},
 {id: 2, title: &quot;The Stand&quot;, author: &quot;Steven King&quot;},
 {id: 3, title: &quot;The Postman Always Rings Twice&quot;, author: &quot;James M. Cain&quot;}
    ];
}

//   اینجا ما متغیر و توابع رو
// کردیم export 
module.exports.favoriteAuthor = favoriteAuthor; 
module.exports.favoriteBook = favoriteBook; 
module.exports.getBookRecommendations = getBookRecommendations; کدها کاملا گویا هستند و کامنت هم گذاشتم تا راحت تر متوجه بشیدحالا میریم تا در جای دیگه از این ماژول استفاده کنیم, فایلی جدید با نام myApp.js بسازید و کد زیر رو داخلش قرار بدید:var book = require(&#039;./book_recomendation&#039;)

let favoriteAuthor = book.favoriteAuthor
let favoriteBook = book.favoriteBook()
let bookRecomendation = book.getBookRecommendations()

console.log(&#039;\n\n \n\n&#039;)
console.log(favoriteBook)
console.log(&#039;\n\n__________________\n\n&#039;)
console.log(favoriteAuthor)
console.log(&#039;\n\n__________________n\n&#039;)
console.log(bookRecomendation)
console.log(&#039;\n\n__________________n\n&#039;)در خط اول ما فایل ماژول رو require کردیم و داخل متغیر book ریختیم, حالا با استفاده از متغیر book میتونیم به توابع و متغیرهایی که export کرده بودیم دسترسی داشته باشیمدر خط های 3-4 و 5 متغیر و توابعمون رو داخل متغیرهایی قرار دادم و در ادامه داخل کنسول چاپ کردم, نتیجه برنامه رو در تصویر زیر مشاهده میکنید:خب این آموزش هم تموم شد امیدوارم که لذت برده باشیدهر گونه سوال براتون پیش اومد بپرسید جواب خواهم داد</description>
                <category>Node.js</category>
                <author>IranForexTraders</author>
                <pubDate>Thu, 04 Apr 2019 17:26:13 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی با nodejs/جلسه سوم/Node.js Modules</title>
                <link>https://virgool.io/nodejs/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-nodejs%D8%AC%D9%84%D8%B3%D9%87-%D8%B3%D9%88%D9%85nodejs-modules-kmonukpstipn</link>
                <description> اصلا Module چیه؟ماژول ها رو مثل کتابخانه های جاوااسکریپتی بدونید, در واقع مجموعه ای از توابع هستند که قرار هست داخل برنامه ازشون استفاده کنیم.ماژول ها به ما این امکان رو میدن تا برنامه های بزرگ رو به قطعات کوچک و برنامه های کوچتر تقسیم کنیم و روند توسعه برنامه رو برامون آسون تر میکنه.در داخل هر ماژول, شیی به نام module وجود داره که به ماژول فعلی اشاره میکنه و اطلاعاتی از قبیل نام و id ماژول فعلی رو در داخل خودش نگه میداره.ماژول های درونی( Built-in Modules )نود جی اس یه سری ماژول های درونی داره که وقتی شما نود رو نصب میکنید به طور خودکار نصب میشن و تنها کاری که شما باید انجام بدید این هست که از این ماژول ها استفاده کنید(لقمه آماده D:) که کم کم با این ماژول ها آشنا خواهیم شد و ازشون استفاده خواهیم کردنحوه استفاده از ماژولبرای استفاده از ماژول, از تابع ( ) require و نام ماژول مورد نظر استفاده می کنیم: var http = require(&#039;http&#039;); الان برنامه شما به ماژول &#x27;http&#x27; دسترسی داره و می تونید با استفاده از اون سرور خودتون رو راه اندازی کنیدhttp.createServer(function (req, res) {
    res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
    res.end(&#039;Hello World!&#039;);
}).listen(8080); در قسمت قبل از این کد استفاده کردیم و اولین برنامه خودمون رو نوشتیمماژول &#x27;http&#x27; نمونه ای از یک Built-in module هستساخت ماژول شخصی!شاید به ماژولی نیاز داشته باشید که به صورت آماده وجود نداشته باشه! خب تکلیف چیه؟اینجاس که شما میتونید ماژول موردنظر خودتون رو بسازیدبرای ساخت ماژول شخصی ابتدا فایلی با عنوان currentTime.js در پوشه روت پروژه خودتون بسازید و کد زیر رو داخلش قرار بدید:  let currentTime = function () {
 return Date()
}

module.exports = { currentTime }; در اینجا متغیری با نام currentTime ساختیم و مقدار اون رو برابر با تابعی قرار دادیم که زمان فعلی رو بر میگردونه. از module.exports به این منظور استفاده میشه تا از توابع و مقادیر داخل ماژول در جاهای دیگه و فایل های دیگه استفاده کنیم  برای آشنایی بیشتر با module.exports نوشته ای آماده کردم که میتونید از این لینک بهش دسترسی داشته باشیدیادتون نره حتما بعد نوشتن کدها اونو save کنیدفراخوانی و استفاده از ماژول شخصیاگر یادتون باشه چند خط بالاتر گفتم که برای استفاده از ماژول باید اون رو با استفاده از تابع require فراخوانی کنیم,  حالا به فایل myFirst.js میریم تا از ماژول خودمون استفاده کنیم برای فراخوانی ماژول های خودمون مسیری که فایل ماژول اونجا قرار داره رو به تابع require میدیم:var http = require(&#039;http&#039;);
var time = require(&#039;./myDate&#039;) //در اینجا ماژول خودمون رو فراخوانی کردیم 

http.createServer(function (req, res) {
 res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
 res.end(time.currentTime()); // در این قسمت از ماژول خودمون استفاده کردیم
}).listen(8080); ماژول خودمون رو فراخوانی و درون متغیر time قرار دادیم , حالا متغیر time به توابع یا متغیرهایی که داخل ماژول export کردیم دسترسی داره و با نوشتن time و زدن یک نقطه میتونیم ازشون استفاده کنیم که این کار رو در خط 6 انجام دادیم.حالا فایل رو ذخیره میکنیم و با دستور node myFirst.js برنامه رو اجرا میکنیم, به مرورگر میریم و آدرس localhost:8080 رو در قسمت آدرس وارد میکنیم, اگر همه چیز رو درست انجام داده باشیم با تصویر زیر روبرو میشیممنبع: www.w3schools.com با کمی تغییر D:</description>
                <category>Node.js</category>
                <author>IranForexTraders</author>
                <pubDate>Thu, 04 Apr 2019 13:24:04 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی با nodejs/جلسه دوم/نصب Node و نوشتن اولین برنامه!</title>
                <link>https://virgool.io/nodejs/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-nodejs%D8%AC%D9%84%D8%B3%D9%87-%D8%AF%D9%88%D9%85%D9%86%D8%B5%D8%A8-node-%D9%88-%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-yyt6xuifm0o3</link>
                <description>نصب Nodeبرای شروع کار ابتدا باید Node رو روی سیستم خودتون نصب کنید که برای این کار میتونید به وب سایت اصلی مراجعه کنید:  Nodejs.org با مراجعه به این سایت شما با دو نسخه روبرو میشید که پیشنهاد میشه نسخه LTS رو دانلود و نصب کنید.شروعبعد از اینکه با موفقیت Node رو روی سیستم خودتون نصب کردید طبق رسوم دیرینه دنیای برنامه نویسی میریم تا برنامه &quot;سلام دنیا&quot; رو بنویسیم D:برای این کار یه پوشه با اسم first-project یا هر اسمی که دوست دارید ایجاد میکنیم من این پوشه رو در مسیر  E:\Programming\first-project ساختمبعد از ساخت پوشه برنامه VS code رو اجرا میکنیم و آیکونی که با فلش سفید در تصویر زیر مشخص شده رو انتخاب میکنیمو Open Folder رو انتخاب و پوشه ای که ساخته بودیم رو انتخاب میکنیم.حالا یک فایل میسازیم تا کد نویسی رو شروع کنیم, برای اینکه یک فایل جدید بسازید چند تا راه هست:1- فشردن همزمان کلیدهای Ctrl+N 2- از منوی بالا گزینه File -&gt;new File 3- یا همونجور که توی عکس بالا براتون مشخص کردم اون آیکون کوچولو رو بزنید که من بیشتر از این راه استفاده میکنم چون راحت تره.با یکی از راه های بالا فایلی با نام myFirst.js میسازیم &quot;دقت کنید که پسوند فایل حتما .js باشه&quot; بعد از اینکه فایل رو ساختید کد زیر رو داخلش قرار بدید و با فشردن همزمان Ctrl+s فایل رو ذخیره کنید.  const http = require(&#039;http&#039;);http.createServer(function (req, res) {
  res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html&#039;});
     res.end(&#039;Hello World!&#039;);
}).listen(8080);   نگران چیزی نباشید تک تک قسمت هارو جلوتر براتون توضیح خواهم داد :)این تکه کد کوتاه و مختصر به کامپیوتر میگه جمله &quot;Hello World&quot; رو چاپ کن.برای اینکه برنامه hello world مون رو اجرا کنیم باید فایل حاوی کدمون رو اجرا کنیم, برای اینکار باید &quot;Cmd&quot; رو اجرا کنیم که برای اینکار از منوی بالا گزینه Terminal -&gt; New terminal رو انتخاب کنید برای اجرای برنامه خودمون کد زیر رو داخل Terminal وارد و اینتر رو میزنیمnode myFirst.js و برای دیدن نتیجه کار مرورگر رو باز میکنیم و آدرس زیر رو وارد میکنیم  http://localhost:8080 تبریکاولین برنامه تون رو با Nodejs اجرا کردید.منبع:www.w3schools.com با کمی تغییر D:</description>
                <category>Node.js</category>
                <author>IranForexTraders</author>
                <pubDate>Thu, 04 Apr 2019 02:10:59 +0430</pubDate>
            </item>
                    <item>
                <title>سرور مجازی برای پروتوتایپ بدون حتی یک ریال هزینه (ستاپ ساده ی Node js با Heroku)</title>
                <link>https://virgool.io/nodejs/%D8%B3%D8%B1%D9%88%D8%B1-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%D8%B1%D9%88%D8%AA%D9%88%D8%AA%D8%A7%DB%8C%D9%BE-%D8%A8%D8%AF%D9%88%D9%86-%D8%AD%D8%AA%DB%8C-%DB%8C%DA%A9-%D8%B1%DB%8C%D8%A7%D9%84-%D9%87%D8%B2%DB%8C%D9%86%D9%87-%D8%B3%D8%AA%D8%A7%D9%BE-%D8%B3%D8%A7%D8%AF%D9%87-%DB%8C-node-js-%D8%A8%D8%A7-heroku-%DB%B1-dq2dldpxb5gg</link>
                <description>البته هزینه که می تونه داشته باشه مثل...هزینه ی قهوه یا اینترنت یا برق یا زمان یا ... ولی به هر حال دیگه هزینه ی سرور رو نمی دید برای تست کردن و پروتوتایپ محصول تون...!داستان از این قرار بود که روزی از روز ها ما در چندپر آروم آروم تصمیم گرفتیم که لانچ کنیم. در همین حین هم من توی Backend مون می خواستم یک سری بدهی های فنی رو درست کنم و هم این که فیچر هایی رو که قبلا برنامه ریزی شده رو اضافه کنم (تا بک اند همیشه از دوستان فرانت جلوتر باشه و دوست داشتنی تر) این طوری شد که نیاز به سرور تست پیش اومد.منم مثل همیشه گوگل رو باز کردم و گفتم که ای گوگل جادویی آیا سرویس دهنده ای هست که سریع و راحت این کارو برام انجام بده!؟ اونم سخاوتمندانه بعد از نشون دادن کلی Ads و اینا ... سرویس Heroku رو بهم معرفی کرد (خب واقعا قبلش سرویسی رو نمی شناختم)https://www.heroku.com/این کشف من ؛ آموزش ها و نمونه های آماده برای انواع زبان های برنامه نویسی رو داشت و خیلی سریع (تقریبا) تونستم یه Node js اپلیکیشن رو باهاش ران کنم. پنل رایگانش هم به این صورته که اگر نیم ساعت غیر فعال باشه به حالت Idle می ره یعنی تا اولین request بعدی به حالت خواب می ره و بعدش فعال می شه مثل اولش (توی عمل مشکلی ایجاد نکرده به اون صورت) تا حدی هم از سرور اصلی خودمون پرسرعت تر نشون داده! کانفیگ و موارد تکمیلی رو می تونین توی سایتش بخونینیه مشکلی که بهش برخورده بودم این بود که ما در بک اند مون از تکنولوژی های متنوع و زیادی استفاده می کنیم مثل RabbitMQ برای ارسال پیام از cluster به worker ها (بعدن در موردش براتون می نویسم خیلی شگفت انگیزه برام) و یا Reddis برای کش سرور و رکوئست و یا حتی MongoDB خودمون برای دیتابیس. راستش نصب و راه اندازی این تکنولوژی ها توی این محیط جدید چالش برانگیز و زمان بر بود (برای یه سرور تست که نباید این قدر وقت گذاشت!) به خاطر همین همشو از پنل های رایگان سایت های زیر استفاده کردم و برای سرور تست مون هم واقعا کافی بود (آدرس لینک سایت مربوط جلوی هر کدوم هست)MongoDb (M lab): https://mlab.com/Redis (Redis Labs): https://redislabs.com/RabbitMQ (CloudAMQP): https://www.cloudamqp.com/خیلی راحت و عالی با کار های زیر Node js Backend مون رو همراه با pm2 و یه سری کار های دیگه آماده کردم:راه اندازی ساده ی Node js با Heroku بدون داکر و این حرفا!مرحله ی اول: بایستی مطمئن بشید که Node js اپلیکیشن تون کار می کنه یا نه! بعدش کانفیگ pm2 رو با دستور زیر به پروژه تون اضافه کنید:npm install pm2 -g
pm2 initبعدش می بینید که یه فایلی در کنار فایل های پروژه تون در مسیر روت اضافه می شه به نام ecosystem.config.js که من اونو برای خودم به شکل زیر کم و زیادش کردم (حالا توضیح می دم براتون)module.exports = {
apps : [
 // start point application
    {
      name      : &#039;api&#039;,
      script    : &#039;app.js&#039;,
      exec_mode: &quot;cluster_mode&quot;,
      instances: &quot;2&quot;
    },

 // cron jobs
    {
 &quot;name&quot;: &quot;cronJobs&quot;,
 &quot;script&quot;: &quot;./cron.js&quot;,
 &quot;instances&quot;: 1
    },

 // workers
    {
 &quot;name&quot;: &quot;smsWorker&quot;,
 &quot;script&quot;: &quot;./workers/smsWorker.js&quot;,
 &quot;instances&quot;: 1
    },
    ...
  ]
};خب کامنت گذاشتم و مشخصه که چه خبره! داکیومنتیشن pm2 خوشبختانه خیلی خوبه و پیشنهاد اکید می کنم که به توضیحات مربوط به این فایل و نحوه ی نوشتنش یه نگاه بندازید. کاربرد های مفید زیادی داره که بایستی ازش بهره ببریم ولی من توی این نوشته فعلا نادیده گرفتم تا بعد.مرحله ی دوم: در اینجا باید بریم سراغ فایل همیشه در صحنه (و تا قسمتی اعصاب خوردکن) package.json تا یه سری تغییراتی توش بدیم. اول این که اسکریپت استارت رو باید مشخص کنیم.قبل از بررسی package.json ؛ ما با یک حرکت هکر مانند باید کاری کنیم که خیلی راحت بتونیم توی اسکریپت استارت از pm2 استفاده کنیم. خود pm2 یه داکیومنتیشن مخصوص این کار داره ولی من اونو نتونستم اجرا کنم چون مدام به دردسر افتادم (گفته بودم که نمی خواستم وقت بذارم براش!) یعنی من اول اومدم pm2 رو توی پروژه نصبش کردم به صورت زیر:npm install pm2و بعدش با استفاده از همون pm2 که الآن توی پروژه به صورت لوکال نصب شده ؛ package.json رو به صورت زیر ویرایش کردم:&quot;scripts&quot;: {
 &quot;test&quot;: &quot;node app.js&quot;,
 &quot;start&quot;: &quot;node ./node_modules/.bin/pm2 start ecosystem.config.js &amp;&amp; node ./node_modules/.bin/pm2 logs&quot;
 }در واقع توی اسکریپت استارت (که توسط heroku قراره ران بشه) میاد طبق کانفیگ بالا (بالاتر!) Node js اپلیکیشن مون رو ران می کنه و بعدش لاگ می کنه تا ببینیم چه خبرهدر آخر هم می تونیم ورژن مورد نظر nodejs و npm مون رو مشخص کنیم که البته اختیاریه (برای من هنوز مهم نیست) این مورد رو از اینجا بخونین و درستش کنین اگر دوست داشتینمرحله ی سوم: حالا نوبت به کار با heroku می رسه. شما ابتدا باید با توجه به سیستمی که دارید از طریق خود سایت heroku ابزار CLI رو نصبش کنید بعش به صورت خیلی خلاصه و ساده کامند های زیر رو برای پروژه خودتون اجرا کنید (فرض ما بر اینه که توی داشبورد heroku شما پروژه رایگان جدیدی رو با نام my-heroku-node ایجاد کردید و git هم نصبه و آخرین نسخه ی پروژه ی اخیرتون هم توی گیت push شده)heroku loginheroku git:remote -a my-heroku-nodegit push heroku masterheroku logs &amp;&amp; heroku openدستور اول برای لاگین کردن توی heroku هست که ایمیل و رمزتون رو به ترتیب می پرسه. دستور دوم میاد آدرس گیت سرور مخصوص پروژه تون رو به گیت سیستم تون اضافه می کنه تا شما قادر باشید از دستور سوم برای delpoy و راه اندازی پروژتون استفاده کنید. دستور سوم کلی کار می کنه و در مقایسه با ssh کردن و این حرفا خیلی راحت و جالبه! و در نهایت دستور آخر هم logs رو به همراه باز شدن آدرس node js اپیلیکیشن تون می بینیدپس نوشت۱ : با داکر هم می شه node js (و هزاران ترکیب دیگه) رو خیلی راحت و لذت بخش با heroku راه انداختپس نوشت۲: اخیرا مطلبی رو توی ویرگول دیدم درباره ی سرویسی ایرانی به نام فندق خب من به شخصه ترجیح می دم توی این گونه موارد از سرویس ایرانی استفاده کنم ولی حیف که دیرتر از heroku متوجه شدم که همچین چیزی ایرانیش هم هست! هر وقت باهاش کار کردم تجربه ی اون رو تقدیمتون می کنم https://virgool.io/@felfel/%DA%86%D8%B1%D8%A7-%D8%AF%D8%A7%DA%A9%D8%B1-%DA%86%D8%B1%D8%A7-%D9%81%D9%86%D8%AF%D9%82-cgvw3czrxu19 </description>
                <category>Node.js</category>
                <author>صادق محبی</author>
                <pubDate>Tue, 25 Sep 2018 23:04:19 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی خودمونی روش های راه اندازی Node js در کنار Apache</title>
                <link>https://virgool.io/nodejs/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AE%D9%88%D8%AF%D9%85%D9%88%D9%86%DB%8C-%D8%B1%D9%88%D8%B4-%D9%87%D8%A7%DB%8C-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-Node-js-%D8%AF%D8%B1-%DA%A9%D9%86%D8%A7%D8%B1-Apache-l5r0siqpfrh9</link>
                <description>قدیمیا می گفتن که دو پادشاه در یک اقلیم نمی گنجد...در دنیای سرور و اینا هم می گن که دو تا وب سرور در یک سرور نگنجد!البته اینقدر زود نتیجه گیری نمی کنم. اولا غیر ممکن نداریم و دوما ما با شرایطی روبرو هستیم که ناگزیر باید دوتا وب سرویس رو توی سرور مون بیاریم بالا. مثلا یک مورد متداول اینه که ما سایتمون Angular باشه و بخوایم وبلاگ رو با وردپرس داشته باشیم. خب Node js برای بالا آوردن وردپرس مناسب نیست! و تا جایی که من بلدم بهتره از Litespeed یا apache یا Nginx استفاده کنیم. روش هایی که می دونم می شه این دو تا پادشاه رو کنار هم داشت:۱- پروکسی یا Reverse Proxyدر این مطلب با استفاده از همین روش من یک تست Benchmark ساده و مبتدیانه رو انجام دادم. این رو من خیلی توی سرچ های گوگلم دیدم. وقتی سرچ می کردم که چجوری می تونم Node js رو در کنار apache ستاپ کنم در بیشتر موارد همین کار توصیه شده بود. خب منم اول همین کارو انجام دادم ولی به مشکلات زیر برخورد کردم:۱- بک اند Node js مون بی اندازه کند شده بود (از اونجایی که با ip:port سرعت ۳ تا ۴ برابر بیشتر از دامنه بود که از apache عبور می کرد)۲- خود آپاچی کند تر از سایر وب سرویس هاست و این خودش تاثیر بالایی داشت روی کارایی فرانت۳- کلا خیلی اعصاب خورد کن بود و request های متعددی پیش میومد که اررور timeout میدادبا کانفیگ apache زیر این کارو برای دامنه ی api.example.com انجام دادم (مثلا اگه Node js روی پورت ۳۰۰۰ ران باشه) و این در حالی بود که دامنه ی example.com میومد فایل index.php رو اجرا می کرد (همون وبلاگ وردپرسی که گفته بودم)ProxyRequests off
&lt;Proxy *&gt;
        Order deny,allow
        Allow from all
 &lt;/Proxy&gt;
 ProxyPass / https://localhost:3000/
 ProxyPassReverse / https://localhost:3000/و با این کانفیگ یه همچین اتفاقی می افته (راستش من خودم اینطوری فهمیدم!)۲- پورت فورواردینگ یا Port Forwardingبعد از چند روز کلنجار رفتن و سرچ های وحشیانه و البته یک کلمه ی گهربار از یکی از دوستان سرور کار حرفه ای به این نتیجه رسیدیم که بایستی یه ip استاتیک دیگه بخریم و با استفاده از port forwarding که توسط firewall اجرا می شه بیایم پورت ۸۰ و ۴۴۳ اون ip تازه خریداری شده رو فوروارد کنیم به پورت های Node js Server مورد نظر. نتیجه باورنکردنی بود نسبت به روش قبلی. خیلی ساده و عالی و دوست داشتنی بعد از چند روز تلاش شبانه روزی و سردرد و قهوه خوردن!توی cent os با استفاده از command زیر خیلی ساده این کارو کردم (توی توزیع های این خانواده می شه iptables)iptables -t nat -A PREROUTING -d &lt;ip&gt; -p tcp --dport 80 -j REDIRECT --to-ports 3000sudo service iptables saveو در نتیجه ی این کامند اتفاق زیر می افته:این تجربه ای بود که من توی کار بهش برخورد کردم و نمی دونم شاید روش های دیگه ای هم هست برای حل این مشکل... من شما رو با سرور های زیر دستتون تنها می ذارم دیگه خودتون می دونید!</description>
                <category>Node.js</category>
                <author>صادق محبی</author>
                <pubDate>Wed, 19 Sep 2018 14:22:38 +0430</pubDate>
            </item>
                    <item>
                <title>دیباگ کردن Node.js بوسیله Chrome Developer Tools</title>
                <link>https://virgool.io/nodejs/debug-nodejs-with-chrome-devtools-mbbgxylh7p7y</link>
                <description>این اولین نوشته من در اینجاست و فقط خواستم با یه مطلب شروع کنم، به امید اینکه مطالب بعدی رو راحت‌تر شروع کنم.زمانی که برنامه‌نویسی Node.js رو شروع کردم طبق روال همیشگی همه کارها رو با console.log انجام می‌دادم ولی این روش سرعت خیلی کمی داره در حالی که می‌شه از امکانات خوب ابزار DevTools در کروم استفاده کرد.پیش‌نیازهاNode.js v8.0.0+Google Chrome v57+روش کاربرای اجرای برنامه در حالت دیباگ از این دستور استفاده کنید:node --inspect app.js
// یا این دستور برای توقف کد در ابتدای دیباگ:
node --inspect-brk app.jsبعد از اجرای کد بالا باید خروجی شبیه این ظاهر بشه:اجرای Node.js برای دیباگحالا کروم رو باز کنید و توی نوار آدرس تایپ کنید:chrome://inspectدر این صفحه باید فایل پروژه‌ای که در حال دیباگ هستید ظاهر بشه. گزینه زیر رو کلیک کنید:Open Dedicated DevTools For Nodeبا اینکار پنجره آشنای DevTools باز می‌شه که در اون تب Sources فعال هست.حالا می‌تونید دیباگ کدتون رو شروع کنید، با استفاده از کلمه کلیدی debugger در میان کد، یا کلیک روی شماره خطوط در DevTools کد رو در جای مناسب متوقف کنید.اگر خواستید برنامه رو متوقف کنید و دوباره اجرا کنید نیازی به بستن DevTools نیست، بعد از اجرای دستور دیباگ، پنجره‌ای که باز گذاشتید خودبخود به همون کد وصل می‌شه. پیشنهاد بهتر به جای توقف کد و اجرای دوباره هم استفاده از nodemon به جای node است:nodemon --inspect-brk app.jsمطالعه بیشترGet Started with Debugging JavaScript in Chrome DevTools</description>
                <category>Node.js</category>
                <author>مرتضی</author>
                <pubDate>Tue, 20 Feb 2018 20:09:34 +0330</pubDate>
            </item>
            </channel>
</rss>