<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات جامعه نود جی اس ایران</title>
        <link>https://virgool.io/iran-nodejs-community/feed</link>
        <description>جامعه نود جی اس ایران یک جامعه non-profit است که هدف آن نشر علم در زمینه نود جی اس است</description>
        <language>fa</language>
        <pubDate>2026-06-07 15:33:26</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/36erddmwrqgc/yvju9a.png</url>
            <title>جامعه نود جی اس ایران</title>
            <link>https://virgool.io/iran-nodejs-community</link>
        </image>

                    <item>
                <title>چگونه از ES6 در NodeJS استفاده کنیم؟</title>
                <link>https://virgool.io/iran-nodejs-community/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A7%D8%B2-es6-%D8%AF%D8%B1-nodejs-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-lcwi8sciyhe4</link>
                <description>برای اینکه از ES6 در NodeJS استفاده کنیم، ما از Babel استفاده میکنیم.‌Babel چیست؟Babel یک کامپایلر جاوا اسکریپت است. به وسیله Babel ما میتونیم کد +ECMAScript 2015 را به نسخه های قبلی جاوا اسکریپت تبدیل کنیم.۱ـ برای این کار ابتدا باید NodeJS رو در سیستم خود نصب کنیم. اگر هنوز NodeJS رو نصب نکردین، کافیه اینجا کلیک کنین. البته این لینکی که گذاشتم برای لینوکسی ها هستش؛ اگه توی ویندوز هستین کافیه برین توی سایت NodeJS و دانلودش کنین. نصبش هم خیلی راحته، فقط چند تا next داره! ((:۲ـ بعد از نصب NodeJS، یک پروژه ی جدید میسازیم. mkdir new_project
cd new_project۳ـ درون مسیری که برای این پروژه خود ساختیم؛ دستور زیر رو مینویسیم تا package.json به پروژه ی ما اضافه بشه.npm init۴ـ حالا Babel را نصب میکنیم.npm install --save-dev @babel/core @babel/cli
npm install @babel/preset-env --save-dev۵ـ درون فایل  package.json میریم و قسمت scripts رو شبیه زیر تغییر میدیم.&amp;quotscripts&amp;quot: {
&amp;quottest&amp;quot: &amp;quotecho \&amp;quotError: no test specified\&amp;quot &amp;&amp; exit 1&amp;quot,
&amp;quotbuild&amp;quot: &amp;quotbabel src -d lib&amp;quot
}۶ـ درون پروژه خود یه پوشه ی src میسازیم و یه فایلی به هر نامی که دلمون میخواد درون پوشه ی src میسازیم. (من اسمش رو index.js گذاشتم)حالا یه سری کد ES6 توش مینویسیم. مثل:import request from &#039;requests&#039;;
let helloWorld = &#039;Hello World!`;
console.log(`${helloWorld} this is some ES6 JavaScript code`);۷ـ درون دایرکتوری اصلی پروژه، فایلی به نام babelrc. میسازیم.درون این فایل کد زیر رو مینویسیم:{   &amp;quotpresets&amp;quot: [&amp;quot@babel/preset-env&amp;quot] }۸ـ با زدن دستور زیر در دایرکتوری اصلی پروژه، به طور خودکار پوشه ای به نام lib ساخته میشود و درون این پوشه فایلی به نام index.js نیز ساخته میشود. درون این فایل هم، کد هایی که در مرحله ۶ نوشته بودیم کامپایلر شده و درون این فایل قرار میگیرد.npm run build* در واقع در این مرحله babel، کد +ECMAScript 2015 رو به نسخه های قبلی جاوا اسکریپت کامپایلر میکنه.</description>
                <category>جامعه نود جی اس ایران</category>
                <author>Hossein Safari</author>
                <pubDate>Thu, 12 Dec 2019 23:18:58 +0330</pubDate>
            </item>
                    <item>
                <title>ساختن بک‌اند تایپ‌اسکریپتی - بخش ۴: هر کاربر، Todoهای متفاوت</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D8%A8%DA%A9%D8%A7%D9%86%D8%AF-%D8%AA%D8%A7%DB%8C%D9%BE%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA%DB%8C-%D8%A8%D8%AE%D8%B4-%DB%B4-%D9%87%D8%B1-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-todo%D9%87%D8%A7%DB%8C-%D9%85%D8%AA%D9%81%D8%A7%D9%88%D8%AA-lytm2xb6riaq</link>
                <description>NestJSسرفصل‌هافریمورک NestJS چیست و چرا؟شروع پروژه Todoدیتابیس!هر کاربر، Todoهای متفاوتمقدمهتوی بخش قبل Todoها رو توی دیتابیس ذخیره کردیم و تونستیم که اون‌ها رو صورت دائمی اونجا نگهداری کنیم. اما هیچکس نمیخواد که Todoهایی داشته باشه که بقیه بتونن اونارو ببینن و حتی ویرایش و حذف کنن!توی این بخش سراغ یکی از بخش‌های اصلی هر API میریم. اینکه کاربرها رو اعتباریابی (authenticate) کنیم و اون‌ها رو توی سیستم خودمون بشناسیم و بتونیم داده‌های شخصی‌سازی شده برای اونها داشته باشیم.مقدمه‌ی بیشتربرای اینکه توی اپلیکیشن font-end کاربر رو لاگین نگه داریم چندتا استراتژی وجود داره. یکیش اینکه که وقتی کاربر توی صفحه ورود، ایمیل و پسورد رو وارد کرد، اون‌ها رو ذخیره کنیم و برای درخواست‌های بعدی همون رو بفرستیم برای backend. اونجا هم توی هر ریکوئست ایمیل و پسورد رو بررسی کنیم و کاربر رو اعتبار یابی کنیم. ولی ذخیره پسورد کاربر روش خوبی نیست. اصلا نیست!روش دیگه اینه که وقتی کاربر ایمیل و پسورد رو وارد کرد و درست بود، ما بهش یک Token بدیم که این Token مثل بلیت کاربر برای استفاده از سیستم میمونه. ولی به مدت محدود.از: https://blog.larapulse.com/web/jwtروش مرسوم در APIها استفاده از JWT (Json Web Token)‎ هست. این نوع توکن از سه بخش تشکیل شده. بخش اول که بهش header میگن، یک استرینگ json هست که اطلاعاتی مثل نوع توکن و الگوریتم استفاده شده برای امضا رو توی خودش نگه میداره (سمت چپ). در آخر این استرینگ json با base64 کد شده (سمت راست). بخش دوم (payload) اطلاعاتی که ما نیاز داریم برای این توکن رو نگهداری میکنه. مثلا id کاربری که این توکن مال اون هست و یک عدد رندوم برای اینکه توکن‌ها مثل هم نباشن و حتی تاریخ منقضی شدن توکن. این بخش هم استرینگ json هست که با base64 کد شده. بخش سوم JWT، امضا (signature) از بخش اول و دوم هست که با یک کلید محرمانه که سمت سرور داریم درست میشه. با این امضا میشه مطمئن بود که توکن‌هایی که میسازیم توسط هیچ‌کسی امکان جعل شدن نداره. هر سه بخش با یک نقطه به هم وصل میشن و توکن ما رو تشکیل میدن.نتیجه‌گیریِ مقدمهخب توی اپ nestjs خودمون، ما نیاز به یک endpoint برای لاگین داریم که یوزرنیم و پسورد رو بگیره و اون‌ها رو چک کنه، اگر درست بود JWT برای کاربر برگردونه. از اون به بعد کافیه کاربر توی هر ریکوئست JWT رو بفرسته و ما سمت backend هر جایی که نیاز داشتیم از یک گارد (جلوتر باهاش آشنا میشیم) که JWT رو چک می‌کنه برای محافظت از endpointهایی که نیاز به اعتباریابی کاربر دارن استفاده می‌کنیم.پیاده‌سازی...نصب مواد مورد نیازبرای پیاده‌سازی این ویژگی، نیاز به hash.js برای هش کردن پسورد (پسورد خام رو کسی توی دیتابیس نگهداری نمی‌کنه)، passport (کتابخونه‌ای برای اعتباریابی کاربر با استفاده از روش‌های مختلف) و ماژول ‎@nestjs/passport (برای استفاده از passport در nestjs) و ‎passport-jwt (روش JWT در passport) و همچنین ‎@nestjs/jwt (ماژولی برای راحت کردن کار با JWT) داریم. که خب نصب می‌کنیم.npm install hash.js passport passport-jwt @nestjs/passport @nestjs/jwt
npm install -D @types/passport-jwtایجاد ماژول و entityاول از همه یه ماژول جدید به نام auth میسازیم. این بار از nest cli استفاده می‌کنیم. کامند زیر رو اجرا می‌کنیم.npx nest generate module authاین کامند یک پوشه برای ماژول و کلاس ماژول رو میسازه. توی BootstrapModule هم ماژول جدید رو اضافه می‌کنه.بعد از اون باید کلاس کاربر رو توی سیستم تعریف کنیم. توی پوشه auth یک فایل به نام user.entity.ts با محتوای زیر ایجاد می‌کنیم.user.entity.ts به این شکل entityمون رو توی ماژول رجیستر می‌کنیم.auth.module.tsسرویس JWTاول از همه فایل auth.constants.ts رو برای نگهداری ثابت‌های ماژول ایجاد می‌کنیم.auth.constants.tsقبلا ماژول ‎@nestjs/jwt رو نصب کردیم. این ماژول سرویسی به نام JwtService رو پیاده‌سازی کرده که میتونیم با ایمپورت کردن ماژول توی ماژول خودمون، به این سرویس دسترسی داشته باشیم.auth.module.tsایجاد و پیاده‌سازی سرویس Authبرای نوشتن منطق لاگین کاربر نیاز به یک سرویس داریم. اون هم اینطوری ایجاد می‌کنیم:npx nest generate service authاین دستور یک سرویس به نام auth توی پوشه auth (پوشه ماژولمون) ایجاد می‌کنه و سرویس رو توی ماژول رجیستر می‌کنه. یک فایل تست (spec) هم ایجاد می‌کنه که پاکش می‌کنیم. (سعی کنید تست رو توی روند کار خودتون داشته باشید، به علت ضیغ وقت توی این مقاله تست نداریم)توی سرویس قرار هست که یوزرنیم و پسورد کاربر رو بگیریم و اگر درست بود JWT برگردونیم برای کاربر. اگر هم درست نبود خطایی رو نشون کاربر میدیم.auth.service.tsهمونطور که میبینید، توی constructor، آبجکت JwtService و User Repository رو دریافت کردیم. توی متد لاگین که نوشتیم، email و password رو دریافت کردیم، دنبال یوزری با ایمیل داده شده می‌گردیم. اگر همچین کاربری پیدا نشه، متد findOne مقدار undefined برمیگردونه و اگر پیدا بشه، آبجکت user رو. یوزر پیدا نشده باشه خطایی رو پرتاب می‌کنیم که Nest خطایی برای کاربر میفرسته.اگر کاربر پیدا شده باشه، هش پسورد ارسال شده توسط کاربر رو حساب می‌کنیم و با هش پسورد ذخیره شده توی دیتابیس مقایسه می‌کنیم. اگر هر دو هش یکی باشه، یعنی پسورد اولیه که به تابع هش دادیم هم یکی بوده و پسورد درست هست. بنابراین توکن Jwt رو با استفاده از JwtService ایجاد و امضا می‌کنیم. توی payload فقط id کاربر رو میذاریم. پارامتر بعدی هم زمان منقضی شدن توکن هست که ما 24 ساعت در نظر گرفتیم (بر حسب ثانیه هست). در آخر هم توکن رو به عنوان خروجی متد میفرستیم.ایجاد کنترلربرای ایجاد controller از دستور زیر استفاده می‌کنیم.npx nest generate controller authاینم نگم چیکار می‌کنه دیگه.. خودتون میدونید ;)نکته: دستورات حالت خلاصه هم دارن، میتونید با npx nest راهنمای دستورات و خلاصه‌ها رو ببینید.بعد از generate کردن، به این شکل پیاده‌سازی می‌کنیم.auth.module.tsتوی constructor فقط AuthService رو دریافت می‌کنیم. بعد از اون یک متد با دکوراتور Post داریم که فقط برای متد HTTP POST کار می‌کنه. توی اون با استفاده از Body، از اطلاعات پست شده توسط کاربر، email و password رو میگیریم و خیلی ساده متد login از AuthService رو صدا می‌زنیم و محتوای اون رو برمیگردونیم تا برای کاربر ارسال بشه.تست، تست، تستبهتره تا اینجای کار رو یک دور تست کنیم، بعد ادامه کار رو داشته باشیم. از اونجایی که هنوز کاربری توی دیتابیس نداریم و قابلیت ثبت‌نام کاربر هم نداریم، دستی دیتابیس رو باز می‌کنیم و کاربر رو اضافه می‌کنیم.برای این کار یک بار npm run start:dev رو بزنید که دیتابیس با entityها سینک بشه.بعدش SQLite Browser رو نصب کنید. توی این برنامه، Open Database رو بزنید، فایل app.db پروژه رو باز کنید. سپس روی جدول user راست کلیک کنید و Browse Table رو بزنید. دکمه New Record رو بزنید و توی سطر ایجاد شده، ایمیل و هش پسورد زیر رو وارد کنید. بعد هم Write Changes رو وارد کنید.email: sample@sample.compassword: 3627909a29c31381a071ec27f7c9ca97726182aed29a7ddd2e54353322cfb30abb9e3a6df2ac2c20fe23436311d678564d0c8d305930575f60e2d3d048184d79این متن پسورد، هش شده‌ی 12345 هست. حالا میتونیم با این کاربر، لاگین رو تست کنیم.این ریکوئست رو توی Postman وارد می‌کنیم. و بعد از پست کردن اون.. توکن رو دریافت می‌کنیم. پس همه مراحل خوب انجام شده و لاگینمون کار می‌کنه.Postman login requestپیاده‌سازی Jwt Guardتوی nestjs، گاردها ساختاری هستن برای محافظت کنترلرهامون. توی ماژول ‎@nestjs/passport گارد از قبل تعریف شده‌ای وجود داره که در لایه‌های زیرین از کتابخونه passport برای لاگین کاربر استفاده می‌کنه. کار ما این هست که Jwt Strategy رو برای استفاده درون این ماژول تعریف کنیم.فایل jwt.strategy.ts رو میسازیم.jwt.strategy.tsمتد getUserById که به AuthService اضافه شده، به صورت زیر هست:بخشی از auth.service.tsتوی این استراتژی، از استراتژی موجود در passport-jwt ارث بری می‌کنیم و اون رو با مقادیر خودمون کانفیگ می‌کنیم. توی constructor این کلاس، constructor کلاس ارث‌بری شده رو با super صدا میزنیم و مقادیر لازم رو بهش ارسال می‌کنیم. توی متد validate هم، payload جدا شده از JWT برای ما ارسال میشه و باید بررسی کنیم که آیا درست هست یا نه. چون ما id رو توی payload ذخیره می‌کردیم، کاربری با این id پیدا بشه یعنی JWT درسته، پس کاربر رو برمیگردونیم. اگر نه خطا میدیم.حالا کافیه توی ماژول auth، کلاس JwtStrategy و ماژول PassportModule رو رجیستر کنیم.auth.module.tsالان میتونیم از AuthGuard که توسط ماژول ‎@nestjs/passport پیاده‌سازی شده و در لایه زیرین از کتابخونه passport استفاده می‌کنه و به JwtStrategy که پیاده‌سازی کردیم وصله، توی کنترلرمون استفاده کنیم.بخشی از todo.controller.tsبا این کار استفاده از کنترلر رو ملزم به ارسال توکن Jwt میکنیم و passport از JwtStrategy ما استفاده می‌کنه و کاربر رو اعتباریابی می‌کنه.هر کاربر، Todoهای متفاوتبرای اینکه هر کدوم از کاربرها Todoهای متفاوتی داشته باشن باید ساختار entity برای Todo رو تغییر بدیم. ارتباط Todo به User یک ارتباط چند به یک هست. یعنی چند Todo میتونن به یک کاربر ربط داده بشن.بخشی از todo.entity.tsاینجا ما یک property جدید توی کلاسمون ایجاد کردیم و با دکوراتور ManyToOne، رابطه اون با User رو مشخص کردیم.نکته: اگر از قبل Todo توی دیتابیس داشتید، احتمالا با اجرای برنامه به دلیل تغییر ساختار جداول به مشکل میخورید. باید فایل app.db قبلی رو پاک کنید و دوباره برنامه رو اجرا کنید تا فایل با ساختار جدید ایجاد بشه. البته همه Todo ها و کاربری که چند پاراگراف قبل ایجاد کردیم هم پاک میشه. کاربر رو دوباره ایجاد کنید که بهش نیاز داریم.حالا سرویسمون رو جوری می‌نویسیم که موقع ذخیره Todo و گرفتن از دیتابیس، User رو در نظر بگیره.todo.service.tsهمونطور که میبینید، توی constructor، آبجکت ریکوئست رو دریافت می‌کنیم. این آبجکت اطلاعاتی راجع به ریکوئست کاربر در اختیار داره. مثل header های ریکوئست. هنگامی هم که از ماژول passport استفاده می‌کنید، کاربری که اعتباریابی اون انجام شده به این آبجکت اضافه میشه، پس با ریکوئست به آبجکت کاربر دسترسی داریم.حالا کافیه هر جایی که نیاز هست، این کاربر رو در ذخیره کردن و گرفتن Todoها از دیتابیس دخیل کنیم. توی شرط‌هایی find و توی آبجکتی که برای save میفرستیم!تستبرای تست این مطالب تازه اضافه شده، ابتدا باید لاگین کنید و یک توکن جدید بگیرید. لاگین رو که قبلا گفتیم...با در دست داشتن توکن، توی Headerهامون، یک بخش به صورت:Authorization: Bearer {token}اضافه می‌کنیم و درخواست‌هامون رو با این Header ارسال می‌کنیم. بقیه مراحل مثل بخش اول هست. برای ایجاد و آپدیت و دیلیت و گرفتن Todoها میتونید endpointهای مختلفی که داشتیم رو تست کنید.Postman Authorization headerسخن پایانیامیدوارم که این نوشته برای شما مفید بوده باشه. بخش آخر یکم عجله‌ای شد. اگر مشکلی در نوشته‌ها هست یا سوالی در این خصوص هست میتونید توی کامنت‌ها بگید.سورس کامل پروژه هم میتونید توی این مخزن گیت‌هاب پیدا کنید.</description>
                <category>جامعه نود جی اس ایران</category>
                <author>حسین صادقی</author>
                <pubDate>Fri, 23 Aug 2019 20:16:23 +0430</pubDate>
            </item>
                    <item>
                <title>ساختن بک‌اند تایپ‌اسکریپتی - بخش ۳: دیتابیس!</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D8%A8%DA%A9%D8%A7%D9%86%D8%AF-%D8%AA%D8%A7%DB%8C%D9%BE%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA%DB%8C-%D8%A8%D8%AE%D8%B4-%DB%B3-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-bbk2njhmiwhj</link>
                <description>NestJSسرفصل‌هافریمورک NestJS چیست و چرا؟شروع پروژه Todoدیتابیس!هر کاربر، Todoهای متفاوتاگر این سری نوشته‌ها رو دنبال کرده باشید، میدونید که رسیدیم به اونجا که API خودمون رو برای اپلیکیشن ذخیره Todoها ایجاد کردیم و عملیات ایجاد کردن Todo، لیست کردن و گرفتن جزئیات یک Todo، آپدیت و حذف رو پیاده‌سازی کردیم و اطلاعات رو ذخیره می‌کردیم، ولی توی مموری!برای کار با دیتابیس و ذخیره‌سازی دائمی داده‌ها، NestJS ماژولی برای کار با TypeORM (که بهترین ORM تایپ‌اسکریپتی هست به نظر من :)) ارائه داده که کار رو ساده خیلی می‌کنه.در ادامه این نوشته، با استفاده از این ORM اپلیکیشنمون رو تغییر میدیم و داده‌ها رو در دیتابیس ذخیره می‌کنیم. بریم بیایم.قبل از شروعتوی بخش قبلی ما ماژول Todo رو ساختیم و همون رو به عنوان پارامتر به متد create از NestFactory دادیم. ولی با گسترش اپلیکیشن ما فقط ۱ ماژول نداریم که بتونیم این کار رو بکنیم، برای همین ماژولی رو در نظر میگیریم که وظیفه اون فقط و فقط import کردن بقیه ماژول‌ها هست (هیچ سرویس و کنترلی نداره) و اون رو میدیم به NestFactory. من اسم این ماژول رو میذارم BootstrapModule، به این صورت:bootstrap.module.tsحالا دیگه میتونیم بقیه ماژول‌هامون رو هم پیاده‌سازی کنیم و خیلی راحت اینجا import کنیم تا لود بشه.TypeORMاین ORM بر روی ایده‌هایی از Hibernate توی جاوا و Entity Framework توی .NET بنا شده و با استفاده از Decoratorها کار با دیتابیس و عملیات‌های مختلف روی اون رو تا حد زیادی ساده کرده.برای شروع باید این رو پکیج رو نصب کنیم:npm install typeorm @nestjs/typeormبرای این آموزش ما از دیتابیس sqlite استفاده می‌کنیم که باید درایور اون رو هم نصب کنیمnpm install sqilte3بعد از اون، ماژول TypeORM رو توی اپلیکیشن خودمون import می‌کنیم و کانفیگ دیتابیس رو بهش میدیم تا بتونه وصل بشه. کجا بهتر از BootstrapModule میتونه باشه P:ایمپورت TypeORMتوی چند خط اضافه شده، همونطور که قبلا ذکر شد، ماژول TypeOrm رو import کردیم و کانفیگ دیتابیس رو بهش پاس دادیم. متد forRoot یکبار برای اتصال اپلیکیشن به دیتابیس استفاده میشه و متد دیگری به نام forFeature هم وجود داره که جلوتر با اون آشنا میشیم.خط اول توی آبجکت کانفیگ، نوع دیتابیس هست. اینجا از دیتابیس sqlite استفاده می‌کنیم که کل دیتابیس رو توی یک فایل ذخیره می‌کنه و ساده و جمع و جور هست. برای دیتابیس‌های دیگه‌ای که توی production استفاده میشه کانفیگ متفاوتی نیاز هست که تمامی اون‌هارو می‌تونید توی این لینک ببینید.خط دوم کانفیگ، آدرس فایل دیتابیس هست. اگر قبلا دیتابیس خاصی نداشتید هر اسمی میتونید بدید و در صورت نبود اون، اپلیکیشن فایل رو درست می‌کنه.خط سوم و چهارم توی همه نوع دیتابیس‌ها مشترک هست. خط سوم آدرس موجودیت‌های سیستم رو تعریف می‌کنه (TypeORM برای خوندن decoratorها و ایجاد اطلاعات اون‌ها به این گزینه نیاز داره). خط آخر هم جداول دیتابیس رو با چیزایی که توی اپلیکیشن تعریف کردیم یا تغییر دادیم همگام‌سازی می‌کنه. این گزینه سرعت توسعه رو خیلی بالا میبره و برای محیط توسعه عالی هست. ولی برای production باید غیرفعال بشه.شناسایی Entity?توی بخش قبل ما Entity سیستم رو تعریف کردیم. برای اینکه TypeORM بتونه اون رو شناسایی کنه و به خوبی توی دیتابیس جدول رو بسازه و داده‌ها رو ذخیره کنه، باید از decoratorهای TypeORM استفاده کنیم و  Entity خودمون رو برای TypeORM تعریف کنیم.todo.entity.tsبا یه نگاه ساده میشه فهمید که هر کدوم از Decoratorها چه کاری می‌کنه.دکوراتور Entity که مشخص می‌کنه این کلاسمون یک Entity درون سیستم هست و باید برای اون یک Table توی دیتابیس درست بشه.برای مشخص کردن ستون‌های دیتابیس هم دکوراتورهای مختلفی وجود داره که چندتاش رو استفاده کردیم.برای ستون‌های عادی از دکوراتور Column استفاده میشه. در حالت عادی نوع ستون با توجه به نوع فیلد به صورت اتوماتیک انتخاب میشه اما برای انواع پیچیده‌تر، باید نوع ستون رو به عنوان ورودی به این دکوراتور پاس بدید. برای کنترل بیشتر (مثل طول ستون کاراکتری) هم این دکوراتور آبجکتی دریافت می‌کنه که این تنظیمات رو مشخص می‌کنه. مثلا nullable بودن فیلد مثل completeTime. توی این قسمت داکیومنت TypeORM توضیحات کامل این موارد قرار داده شده.دکوراتور PrimaryGeneratedColumn برای مشخص کردن ستون به عنوان کلید اصلی و generated (که به صورت اتوماتیک توسط دیتابیس تولید میشه) به صورت همزمان هست.فیلدهای حاوی دکوراتورهای CreateDateColumn و UpdateDateColumn هم به صورت اتوماتیک هنگام ایجاد و آپدیت این entity، ایجاد و آپدیت میشن.حالا برای اینکه توی ماژول خودمون، یعنی TodoModule به TypeORM و ریپاسیتوری‌های این entity دسترسی داشته باشیم، باید ماژول TypeORM رو با متد forFeature ایمپورت کنیم و entity های مورد نظرمون رو به عنوان پارامتر به این متد پاس بدیم!todo.module.tsبا افزودن این چند خط، به ماژول TypeORM توی این ماژول دسترسی خواهیم داشت. همچنین repository ایجاد شده برای entityمون Todo رو میتونیم داشته باشیم.مرحله آخرخب الان همه چیز سر جاشه? باید از قابلیت‌هایی که تا اینجا بدست آوردیم، استفاده کنیم و داده‌هامون رو ذخیره کنیم. این دفعه توی دیتابیس و برای همیشه.جایی از برنامه که باید تغییر کنه، سرویس‌هامون هست. سرویس Todo رو به شکل زیر تغییر میدیم.todo.service.tsخب! تغییراتی که inject کردن Repository توی constructor و استفاده از این Repository توی همه متدهامون هست. (storage و lastId که برای ذخیره توی مموری نیاز داشتیم رو هم حذف کردیم).در حالت عادی برای استفاده از Injection اینکه تایپ فیلد رو داشته باشیم کافی هست، اما چون Repository تایپ Generic داره و قابلیت‌های Typescript برای خوندن تایپ‌ها توی برنامه کم هست، به دکوراتور InjectRepository نیاز داریم.اول این نکته رو بگم که Repository پیاده‌سازی شده طبق Repository Pattern هست. طبق این پترن شما مستقیماً با دیتابیس تعامل ندارید و از کلاس‌های repository برای ذخیره و حذف و ... استفاده میشه. اینطوری راحت‌تر میشه تست کرد و تغییر داد قسمت‌های مختلف رو.حالا توی متدهای مختلفمون از این repository استفاده می‌کنیم و کارهایی که قبلا توی مموری انجام میدادیم رو با دیتابیس انجام میدیم.چون کار با دیتابیس زمان‌بر هست و async انجام میشه، همه متدهامون async هستن و خروجی اون‌ها Promise خواهد بود.توی متد getTodo از Repository.findOneOrFail استفاده کردیم که یک آبجکت با شرایط خاص (یا مثل اینجا id خاص) رو برمیگردونه. اگر همچین آبجکتی وجود نداشت، exceptionی رخ میده که اینجا هندل نکردیم و کاربر اون رو میبینه.توی متد getTodos هم از Repository.find استفاده کردیم که آرایه‌ای از آبجکت‌ها با شرایط خاص رو برمیگردونه.توی متد createTodo، آبجکت Todo رو داشتیم و توسط متد Repository.save اون رو توی دیتابیس ذخیره کردیم. توجه داشته باشید که خروجی این متد آبجکت کاملمون هست که توی دیتابیس ذخیره شده. برای مثال توی ورودی ما createTime و updateTime وجود نداشت اما توی آیجکتی که از Repository.save میگیریم این فیلدها نیز مقداردهی شده.توی متد updateTodo، آبجکت با آیدی که میخوایم آپدیت کنیم رو از دیتابیس گرفتیم. با استفاده از اون و مقادیر جدیدی که کاربر بهمون داده، آبجکت جدیدی درست کردیم و اون آبجکت جدید رو توی دیتابیس ذخیره کردیم. به دلیل اینکه id یا همون Primary Column مون توی آبجکت نهایی وجود داره، عملیات update با استفاده از Repository.save رخ میده. اما توی متد قبلی همین save رو برای create استفاده کردیم.توی متد deleteTodo هم از Repository.delete استفاده کردیم که آبجکت‌های با شرایط خاص (یا مثل متدهای قبلی با id خاص) رو حذف می‌کنه.خب سرویسمون با این تغییرات، از این به بعد todo ها رو توی دیتابیس ذخیره می‌کنه. و نیازی به دست زدن به بقیه اجزای برنامه نداریم. تنها تغییر کنترلرها، افزودن async/await هست که به خوانایی برنامه کمک می‌کنه.todo.controller.tsهمین دیگه.حالا با اجرای برنامه، فایل دیتابیس sqlite ساخته میشه. به دلیل اینکه توی تنظیمات TypeORM گزینه synchronize رو برابر true قرار دادیم، دیتابیس با Entityهای ما همگام‌سازی میشه و اگر با برنامه‌ای که دیتابیس sqlite رو میخونه، فایل دیتابیس رو باز کنید میبینید که جداول مطابق اون چیزی که خواسته بودیم ساخته شدن.مثل بخش قبل میتونیم آدرس‌های مختلف رو تست کنیم؛ این قسمت رو به خودتون میسپارم P-:جمع بندیتوی این بخش، اطلاعات برنامه رو توی دیتابیس نگهداری کردیم تا با بستن و اجرا کردن دوباره برنامه اطلاعاتمون از بین نره. در این راه از sqlite به عنوان دیتابیس و TypeORM به عنوان لایه ارتباط entity ها با دیتابیس استفاده کردیم.مشکل بعدیمشکلی که هنوز حل نکردیم این هست که همه اطلاعات برای همه کاربران قابل دسترسی هست. ولی خب Todoهای هر کسی با Todoهای کس دیگه فرق داره. بخش بعدی به این میپردازیم که چگونه کاربر توی سیستم تعریف کنیم، اون رو احراز هویت کنیم درون سیستم و Todoهای مخصوص خودش رو براش بسازیم!به پیشنهاد Majid ganji سورس پروژه رو روی گیت‌هات قرار دادم. از اینجا میتونید ببینید.</description>
                <category>جامعه نود جی اس ایران</category>
                <author>حسین صادقی</author>
                <pubDate>Sat, 10 Aug 2019 20:53:03 +0430</pubDate>
            </item>
                    <item>
                <title>ساختن بک‌اند تایپ‌اسکریپتی با NestJS - بخش ۲: شروع پروژه Todo</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D8%A8%DA%A9%D8%A7%D9%86%D8%AF-%D8%AA%D8%A7%DB%8C%D9%BE%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA%DB%8C-%D8%A8%D8%A7-nestjs-%D8%A8%D8%AE%D8%B4-%DB%B2-%D8%B4%D8%B1%D9%88%D8%B9-%D9%BE%D8%B1%D9%88%DA%98%D9%87-todo-mb1bxwk5pqgh</link>
                <description>NestJSسرفصل‌هافریمورک NestJS چیست و چرا؟شروع پروژه Todoدیتابیس!هر کاربر، Todoهای متفاوتتوی بخش اول، بیشتر سعی کردیم با خودِ فریمورک آشنا بشیم و بفهمیم که چطوری کار می‌کنه. وقتشه بریم سراغ پروژه تا درک عمیق‌تری بدست بیاریم.پروژه‌ای که قرار هست انجام بدیم اپلیکیشنی برای وظایف (همون Todo) هست. درسته موضوع خیلی کلیشه‌ای هست اما خب هم به قدر کافی ساده هست که بشه توی چندتا نوشته تمامش کرد و هم انقدر پیچیده هست که مفاهیم مختلف NestJS رو یاد بگیریم، پس انتخاب خوبیه.شروع ? برای ساخت پروژه todo دستور &#x60;nest new todo-app&#x60; رو میزنیم. این دستور همه‌ی پکیج‌های مورد نیاز رو نصب می‌کنه و کنترلر و سرویس Hello World هم ایجاد می‌کنه.غیر از main.ts بقیه فایل‌های ایجاد شده به درد ما نمی‌خوره، پاکشون کنید.ماژول Todoبرای نوشتن app خودمون یک ماژول جدید ایجاد می‌کنیم. برای ایجاد ماژول جدید میشه از cli هم استفاده کرد. اما برای درک بهتر خودمون این کار رو انجام میدیم. یک پوشه به نام todo ایجاد کنید. این پوشه همه‌ی اجزای مختلف ماژول رو در بر می‌گیره. حالا باید فایل todo.module.ts رو درست کنیم و محتوای زیر رو داخلش بنویسیم.ماژول Todoالان ماژولمون آماده هست. بریم سراغ کدهای اصلی.تعریف موجودیت‌ها (Entity)به نوع داده‌هایی باهاشون کار می‌کنیم و ذخیره می‌کنیم و برای کاربر میفرستیم موجودیت (Entity)های سیستم میگن. موجودیت‌ها توی هر زبانی کلاس‌های معمولی همون زبان هستن.برای اپ Todo نیاز به یک کلاس داریم که همون Todoهامون رو توش ذخیره کنیم. فایل todo-item.entity.ts رو با محتوای زیر درست می‌کنیم.کلاس Todoتوی این فایل کلاس Todo رو ایجاد کردیم. propertyهای کلاس id برای پیدا کردن Todo خاص، text که همون متن Todo هست، completed برای مشخص کردن اینکه این آیتم انجام شده یا نه. دو فیلد createTime و completeTime هم برای ذخیره زمان ایجاد و انجام شدن آیتم هستن.سرویس Todoتوی این سرویس میخوایم عملیات ساختن، گرفتن، آپدیت کردن و حذف کردن این Entity رو انجام بدیم. فایل todo.service.ts رو میسازیم و برای هر کدوم از این کارها. یک متد ایجاد می‌کنیم.سرویس Todoتوی خط ۴ از دکوراتور Injectable استفاده کردیم تا این سرویس قابل Inject شدن توی کلاس‌های دیگه باشه.توی خط ۶ آرایه خالی برای ذخیره Todoهامون ایجاد می‌کنیم. فعلا Todoها رو توی مموری ذخیره می‌کنیم.خط ۷ هم متغیری برای ذخیره id های اختصاص داده می‌گیریم تا id ها یکتا باشن.متد getTodo ورودی id دریافت می‌کنه و خروجی اون هم یک Todo هست. توی این متد آرایه رو می‌گردیم تا Todo با اون id رو پیدا می‌کنیم. اگر پیدا نشد خطای Not Found رو میفرستیم و اگر پیدا شد اون رو برمیگردونیم.متد getTodos همه‌ی Todoها (کل آرایه) رو برمیگردونه.متد createTodo، آبجکت Todo دریافت می‌کنه، آیدی به اون اختصاص میده و اون رو توی آرایه ذخیره می‌کنه.متد updateTodo هم آبجکت Todo دریافت می‌کنه. سپس ایندکس Todo با آیدی اون رو توی آرایه ذخیره شده پیدا می‌کنه و اون ایندکس آرایه رو با آبجکت جدید جایگزین می‌کنه.متد deleteTodo هم آیدی آبجکتی که قصد حذفش رو داریم دریافت می‌کنه، ایندکسش رو توی آرایه پیدا می‌کنه و اون رو با استفاده از متد splice از آرایه حذف می‌کنه.کنترلر Todoکنترلر Todoاین کنترلر هم خیلی ساده هست. فقط داریم متدهای مختلفی که توی سرویس تعریف کردیم رو صدا می‌زنیم و استفاده می‌کنیم.چندتا چیز جدید اینجا هست.توی دکوراتور Controller اینجا todo رو وارد کردیم. برای همین همه Get و Post و ...هایی که توی این کنترلر داریم با این آدرس شروع میشن.توی خط ۸ هم TodoService رو توی کنترلر Inject کردیم. این جدید نبود ولی دوست داشتم دوباره بگم?توی خط ۱۵، آدرسمون :id رو داریم. این یک جور متغیر توی url هست. هر چیزی ممکنه جای id بیاد. با استفاده از دکوراتور Param به این متغیرها توی url دسترسی داریم. مثلا همون ۱۶ پارامتر id رو گرفتیم.توی خط ۲۰ دکوراتور Body رو داریم که پارامترهایی که توی بدنه درخواست پست شدن رو بهمون میده. اینجا بدنه درخواست باید نوع Todo داشته باشه.حالا کافیه سرویس و کنترلر رو توی ماژول todo رجیستر کنیم و توی main.ts این ماژول رو به NestFactory بدیم.todo.module.tsmain.tsوقت تست!تا اینجای کار یک اپ نوشتیم که Todoها رو میسازه، لیست می‌کنه، آپدیت و حذف می‌کنه. وقتشه که تست کنیم ببینیم واقعاً کار می‌کنه؟برای تست از Postman استفاده می‌کنیم. اول اپ رو با دستور npm run start:dev اجرا می‌کنیم و عملیات مختلف رو تست می‌کنیم.وقتی که درخواست خودمون رو با پارامترهای مورد نیاز به آدرس /todo/ بفرستیم، کنترلر createTodo درخواست رو هندل می‌کنه و Todo مورد نظر ما رو ایجاد می‌کنه. خروجی درخواست هم todo با اطلاعات کامل هست که پایین میتونید ببینید. با ارسال درخواست GET به همون آدرس، کنترلر getTodos مسئولیت هندل کردن درخواست رو بر عهده میگیره و آرایه همه Todoهای ذخیره شده رو برای ما میفرسته.متدهای Update و Delete و گرفتن جزئیات یک Todo خاص رو هم با درخواست به آدرس todo/1 میشه برای این todo ساخته شده انجام داد.در آخر هم با زدن Ctrl + C میتونید اپ خودتون رو ببندید.اگر دوباره اپ رو اجرا کنید و آدرس /todo/ رو ببینید، مشاهده می‌کنید که همه‌ی اطلاعات و Todo هایی که ساخته بودیم پاک شده :-\ در واقع ما همه چیز رو توی مموری ذخیره کردیم و مادامی که اپ ما در حال اجرا هست این مموری رو داره. پس بعد از بستن اپ اطلاعات به صورت کامل از بین میره.توی نوشته بعدی برای حل این مشکل اپ Nest رو به دیتابیس وصل می‌کنیم و داده‌هامون رو برای همیشه درون دیتابیس نگهداری می‌کنیم.</description>
                <category>جامعه نود جی اس ایران</category>
                <author>حسین صادقی</author>
                <pubDate>Sun, 21 Jul 2019 19:27:36 +0430</pubDate>
            </item>
                    <item>
                <title>نود جی اس رو از کجا شروع کنیم؟</title>
                <link>https://virgool.io/iran-nodejs-community/%D9%86%D9%88%D8%AF-%D8%AC%DB%8C-%D8%A7%D8%B3-%D8%B1%D9%88-%D8%A7%D8%B2-%DA%A9%D8%AC%D8%A7-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D9%86%DB%8C%D9%85-rq4tup3muhb8</link>
                <description>خیلی مطلب جسورانه ای خواهد بود . چرا که من در حدی نیستم که بخوام پاسخ سوال به این سختی و پیچیده گی رو بدم . اما به دلیل مناعت طبع دوستان که لطف داشتند و از من خواستند مطلبی در این باب بنویسم ، پس  سعی کردم مطابق با تجربه خودم و دیدگاه هایی که وجود داره ، مطلبی بنویسم . اول از همه باید بدونیم داریم چی یاد میگیریم . من چون اعتقاد دارم که  برنامه نویس باید زبان انگلیسی نسبتا خوبی داشته باشد و قصد یاد دادن چیزی هم ندارم ، پس از وب سایت نود جی اس ، یک سری مطالب رو بیان میکنم که فکر میکنم مهم هستند Node.js® is a JavaScript runtime built on Chrome&#x27;s V8 JavaScript engine.Node.js is an open-source, cross-platform JavaScript run-time environment that executes JavaScript code outside of a browser.(wikipedia)طبق گفته های بالا ، نود جی اس یک زبان نیست و همونطور که دیدیم ، یک موتور هست که با جاوا اسکریپت اجرا میشه .جاوا اسکریپتخوب ، اول از همه باید با جاوا اسکریپت آشنا بشیم و تسلط نسبی داشته باشیم روی نحوه کار کردن با جاوا اسکریپت . برای این کار باید یک دید کلی داشته باشیم . باید یک شناسنامه کامل از اکما اسکریپت ها و تفاوت نسخه هایی که موجود هست را بدونیم .  https://en.wikipedia.org/wiki/ECMAScript لینک هایی معرفی میکنم تا بتونیم جاوا اسکریپت رو کامل و خوب یاد بگیریم . به این منظور ، به ترتیب لینک ها رو جلو میریم . البته اعتبار لینک ها تضمین شده هستند .  https://javascript.info/  https://developer.mozilla.org/en-US/docs/Web/JavaScript  https://medium.com/@madasamy/15-javascript-concepts-that-every-nodejs-programmer-must-to-know-6894f5157cb7 نود جی اسدر این مرحله باید حتما بدونیم که نود جی اس داره با چه ساختاری کار میکنه؟ مثل اینکه blocking ‌و non-blocking و تفاوت های async  و sync ‌و ... رو بدونیم . بهتره که داکیومنت جامعی از نود جی اس بخونیم .باندلر هامشکل بعدی که دیده شده و خیلی ها با اون مشکل دارن ، نداشتن مهارت کافی بر روی bundler های جاوا اسکریپت هست . بهتر اینه که بعد از کسب مهارت کافی در جاوا اسکریپت ، دلیل و نحوه استفاده از باندلر ها رو بدونید . JavaScript bundlers are similar to loaders but they are mostly concerned with making code ready for production.همانطور که در بالا نوشتم ، باندلر ها ،‌دغدغه ایجاد یک نسخه production با پرفورمنس خوب را دارند . در لینک زیر میتونید لیست بهترین باندلر ها که در اولین ردیف آن ، webpack  قرار دارد رو ، ببینید .  https://www.slant.co/topics/3900/~best-frontend-javascript-module-bundlers قرار نیست به همه این باندلر ها تسلط داشته باشید . اما باید بتونید به راحتی کانفیگ کنید و اصطلاحات رو درک کنید . فریم ورک ها در مرحله بعدی باید بدونیم که چه هدفی داریم؟ قصد نوشتن کد های سمت وب داریم یا اینکه میخوایم یک نرم افزار بنویسیم که روی دسکتاپ کار کنه یا یک موبایل اپلیکیشن و حتی کارهای روبوتیک و یا  نرم افزارهایی برای arduino  یا میکرو کامپیوتر ها مثل  raspberry pi؟خوب برای هر کدوم ، فریم ورک ها و بویلرپلیت های خاص خودشو داریم . فریم ورک های وب :Express.js https://expressjs.com/ Koa.js https://koajs.com/ Sails.js https://sailsjs.com/ AdonisJs https://adonisjs.com MeteorJs https://www.meteor.com/ NestJs https://nestjs.com مواردی که ذکر شد ، محبوب ترین ها هستند و دلیل بر برتری ندارند و مواردی که نوشته نشدند بسیار زیادندفریم ورک های cross platformElectron js https://electronjs.org/ NW.js https://nwjs.io/ Meteor.js https://www.meteor.com/ ذخیره سازی cache ذخیره سازی در cache برای بالا بردن پرفورمنس اپلیکیشن ها یک امر لازم و مهم است . express-redis-cache https://www.npmjs.com/package/express-redis-cache node-cache https://www.npmjs.com/package/node-cache cache-manager https://www.npmjs.com/package/cache-manager مدیریت پایگاه دادهMongoose ODM (Mongo DB) https://mongoosejs.com/ Sequelize docs.sequelizejs.com TypeORM https://typeorm.io/ Mysql https://github.com/mysqljs/mysql  https://virgool.io/JavaScript8/%D9%86%D9%88%D8%B4%D8%AA%D9%86-%DA%A9%D9%88%D8%A6%D8%B1%DB%8C-mysql-%D8%AF%D8%B1-nodejs-c2qq531hzxir سوکت ها و فریم ورک های آنسوکت یک پروتوکل برای ارتباط real time بین اپلیکیشن ها است (وب ، موبایل ، دسکتاپ و ...). این پروتوکل ، فریم ورک های مختلف زیادی دارد که معروفترین آنه socket.io  هست . البته معروف بودن دلیل بر بهتر بودن نیست . باید بدونید که پروژه شما به چه چیز هایی نیاز دارد . socket.io https://github.com/socketio/socket.io ws https://github.com/websockets/ws Feathers https://github.com/feathersjs/feathers Express-ws https://github.com/HenningM/express-ws انتشار برنامه های وب (Deploying)در این مرحله ، باید نحوه انتشار برنامه ها بر روی وب سایت رو بدونیم . این مورد را Deploy  کردن میگن. برای این کار بهترین روش شناخته شده ، استفاده از PM2 هست PM2 http://pm2.keymetrics.io/ کمی هم داکر خوبهاین مورد لازمه برنامه نویس نیست ، اما خوبه برنامه نویس بدونه داکر چیه و چرا ازش استفاده میکنیم . چون قصد آموزش ندارم و فقط میخوام ریفرنس بدم ، لینک داکر و توضیحاتش رو قرار میدم . Docker is a set of coupled software-as-a-service and platform-as-a-service products that use operating-system-level virtualization to develop and deliver software in packages called containers https://www.docker.com/ میتوانید بعد از این مطلب ، لینک زیر رو بخونین https://virgool.io/liara-ir/%D9%86%D9%88%D8%B4%D8%AA%D9%86-dockerfile-%D8%A8%D8%B1%D8%A7%DB%8C-nodejs-jyxg06dz3ak5</description>
                <category>جامعه نود جی اس ایران</category>
                <author>نیما حبیب خدا</author>
                <pubDate>Sat, 22 Jun 2019 15:10:48 +0430</pubDate>
            </item>
                    <item>
                <title>سیستم فروشگاهی با node.js به نام digiNode</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87%DB%8C-%D8%A8%D8%A7-nodejs-%D8%A8%D9%87-%D9%86%D8%A7%D9%85-diginode-ecqme0q6ihhj</link>
                <description>درود دوستان عزیز. مدتیست که کمبود یک فروشگاه نسبتا خوب فارسی بر روی node.js را احساس کردم و چیزی درخور و مناسب برای این مورد پیدا نکردم. تصمیم  گرفتم از دوستان خبره ای مانند شما در این پروژه کمک بگیرم. من پروژه را  با کمک فورک گرفتن از expressCart ، به حد خوبی رساندم و خواستم فراخوان  بدم تا دوستان وارد این پروژه بشن. شما تصاویر و امکانات را میتوانید در git بنده مطالعه کنید.  https://github.com/nimahkh/digiNode جسارت کردم و برای اینکه به یک نقطه مناسب برسیم، یک ترلو ایجاد کردم به آدرس زیر https://trello.com/diginode خوشحال میشم دوستان یاری برسونن و با کمک هم ، یک پروژه را کامل کنیم . کمبود ها و نواقص زیادی وجود داره که خوشحال میشم با هم رفع کنیمهرجای پروژه سوال و نقصی وجود داشت ، داخل لینک زیر مطرح کنین و من جوابگو همه سوالات شما هستم https://github.com/nimahkh/digiNode/issues موتور قالب با hbs طراحی شده و پایگاه داده mongodb ، توضیحات Readme به زودی کامل و ویرایش میوشند. تشکر</description>
                <category>جامعه نود جی اس ایران</category>
                <author>نیما حبیب خدا</author>
                <pubDate>Fri, 29 Mar 2019 01:46:58 +0430</pubDate>
            </item>
                    <item>
                <title>دریافت لیست شهرهای ایران در node.js</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D9%84%DB%8C%D8%B3%D8%AA-%D8%B4%D9%87%D8%B1%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D8%AF%D8%B1-nodejs-urljfsvzzw2j</link>
                <description>چند روز پیش یک پکیج نوشتم به خواسته یکی از دوستان برای دریافت  استان های ایران و شهرهای مرتبط با استان  و داخل npm قرار دادم و گفتم شاید کسی لازم داشته باشه. البته باید تست ها و یک سری نکات دیگه هم داخل پکیج اضافه بشه که در اسرع وقت این کارو میکنم https://github.com/nimahkh/iran_beauty خیلی کار باهاش سخت نیست . کافیه که با تنظیمات زیر برید جلو npm install @nimahkh/iran_beauty حالا بریم کد بزنیم. کافیه که پکیج رو وارد کنیم و به متوداش برسیم. 
const geoData=require(&#039;./lib/geo-data&#039;);
const tehran = Object.freeze({
  latitude: 35.715298,
  longitude: 51.404343
});

const find=geoData.findProvincesAround(tehran, {
  radius: 1000,
  unit: &#039;km&#039;
});


const provinces=geoData.getProvinces();
const cities=geoData.getCities(1);
const citiesAround=geoData.findCitiesAround(tehran)
const nearestProvince=geoData.findNearestProvince(tehran,{radius:1000,unit:&#039;km&#039;})
 خوب الان این فقط یک مثاله.  ممنون از دوستی که به عنوان contributor داخل پروژه همکاری کردند.  ارادت </description>
                <category>جامعه نود جی اس ایران</category>
                <author>نیما حبیب خدا</author>
                <pubDate>Fri, 15 Feb 2019 23:12:26 +0330</pubDate>
            </item>
                    <item>
                <title>نود جی اس (Nodejs) دقیقا چیه؟</title>
                <link>https://virgool.io/iran-nodejs-community/%D9%86%D9%88%D8%AF-%D8%AC%DB%8C-%D8%A7%D8%B3-nodejs-%D8%AF%D9%82%DB%8C%D9%82%D8%A7-%DA%86%DB%8C%D9%87-z9trs6uw3rs0</link>
                <description> نود جی اس دقیقا چیه ؟نود جی اس یک محیط ران تایم (runtime) برپایه جاوا اسکریپته.خب خیلی عالی ولی ران تایم یعنی چی؟ چجوری کار میکنه ؟ران تایم node شامل همه چیزایی میشه که شما برای اجرای یه برنامه ی جاوااسکریپت نیاز دارید.نود جی اس وقتی به وجود اومد که توسعه دهندگان ربان جاوااسکریپت اون رو از چیزی که فقط تو مرورگر اجرا میشد به یه زبانی تبدیل کردن که بشه اون رو بصورت یه اپلیکیشن مستفل اجرا کرد.یعنی شما الان با جاوااسکریپت کارهایی فراتر از ساختن یه وبسایت تعاملی انجام بدید.جاوااسکریپت الان قابلیت انجام کارهایی داره که زبان هایی مثل پایتون انجام میدن.جاوااسکریپت و nodejs هردوشون روی موتور ران تایم 8v اجرا میشن. این موتور کد جاوااسکریپت شما رو دریافت می کنه و اون رو به یه کد ماشینِ سریعتر تبدیل میکنه. کد ماشین یه کد سطح پایین هستش که کامپیوتر میتونه بدون تفسیر (interpret) کردن اون رو اجرا کنه.چرا نود جی اس ؟طبق تعریفی که خود وبسایت nodejs ارائه داده:نود جی اس یه ران تایم جاوااسکریپت بر پایه موتور جاوااسکریپت v8 هستش که در مروگر کروم استفاده می شه.نود جی اس از مدلِ رویداد محور(event driven) ، مسدود نکننده ی ورودی / خروجی (non blocking I/O) استفاده می کند که باعث میشه زبان کم حجم و کارآمدی بشه.اکوسیستم نود جی اس ، یا npm بزرگترین اکوسیستم اوپن سورس در جهان هستش. ما قبلا در مورد خط اول این تعریف صحبت کردیم &quot; نود جی اس یه ران تایم جاوااسکریپت بر پایه موتور جاوااسکریپت v8 هستش که در مروگر کروم استفاده می شه &quot;. حالا بریم درباره دو خط بعدی این تعریف بحث کنیم تا پی ببریم که چرا نود جی اس اینقد پرطرفداره.ورودی/خروجی یا IO میتونه هر چیزی از خواندن / نوشتن فایل های محلی تا ارسال یه درخواست HTTP به Api باشه.ورودی خروجی زمان می بره ، بنابراین اعمال دیگر برنامه رو مسدود میکنه.موقعیتی رو درنظر بگیرید که بخواهیم یه در خواست به دیتابیس بدیم تا اطلاعات user1 و user2 رو بدست بیاریم و اون رو نشون بدیم.پاسخ به این درخواست زمانبره ، اما هر دو درخواست می تونه همرمان و بطور مستقل از هم انجام بشه.ورودی خروجی مسدود شده (blocking I/O)در روش blocking دریافت اطلاعات user2 تا زمانی که اطلاعات user1 روی صفحه چاپ نشده باشد، شروع نمی شود. اگر این یه سرور بود مجبور می شدیم برای هر کاربر جدید یه نخ (thread) جدید شروع کنیم اما زبان جاوااسکریپت تک نخی هستش (نه دقیقا ، اما یه حلقه ی اجرای تک نخی داره که بعدا دربار توضیح میدم).پس این نشون میده که جاوااسکریپت برای اجرای وظایف چند نخی مناسب نیست. اینجاست که روش مسدود نکننده به کمک میاد.روش مسدود نکننده (non blocking I/O)از اون طرف با استفاده از درخواست مسدود نشونده می تونیم درخواست user2 رو انجام بدیم ، بدون اینکه منتظر پاسخ برای user1 باشیم . یعنی میتونیم هر دو درخواست رو بصورت موازی انجام بدیم.این روش نیاز به روش چندنخی رو برطرف می کنه چون سرور حالا می تونه چندین درخواست رو همزمان مدیریت کنه.حلقه اجرا در جاوااسکریتبه تصویر بالا توجه کنید. این کد چیکار می کنه ؟1. تابع ()main رو به پشته ی فراخوانی (call stack) اضافه می کنه2. تابع ()console.log رو به پشته فراخوانی اضافه می کنه. این کد همون لحظه اجرا میشه و از پشته خارج میشه3. تابع (setTimeout(2000 به پشته اضافه می شه.این تابع یه callback داره که 2000 میلی ثانیه یا 2 ثانیه صبر میکنه و بعد اون callback اجرا میشه4. بعد از 2000 میلی ثانیه ، تابع (setTimeout(2000 از پشته ی فراخوانی خارج میشه5. بعد از اون تابع (setTimeout(0 هم به این صورت اضافه میشه. حالا ما دوتا تابع داریم که منتظر اجرا هستن6. بعد از 0 ثانیه تابع (setTimeout(0 به صف اجرا منتقل میشه ، و همین اتفاق برای تابع (setTimeout(2000 میفته.7. در صف اجرا منتظر می مونن تا پشته فراخوانی خالی بشه.چون فقط یه برنامه میتونه تو یه لحظه اجرا بشه. این کار توسط حلقه اجرا یا event loop انجام میشه8. آخرین تابع ()console.log اجرا میشه و تابع ()main از پشته فراخوانی خارج میشه.9. حلقه ی اجرا می بینه که پشته فراخوانی خالیه و صف اجرا خالی نیست . پس callback ها رو (با ترتیب اولین ورودی – اولین خروجی) به پشته فراخوانی برای اجرا ، انتقال میده.NPMکتابخونه های زیادی توسط جامعه فوق برنامه نویسان جاوااسکریپت ساخته شدن که می تونن بیشتر مشکلات عمومی شما رو حل کنن. Npm یا Node Package Manager پکیج های زیادی داره که میتونه توسعه برنامه شما رو سریعتر و کاراتر کنن.تابع Requireاین تابع سه کار رو انجام میده :· ماژول هایی رو که با  نود جی اس خام دردسترس هستن مثل سیستم فایل (file system) و HTTP رو تو برنامه تون بارگزاری می کنه· این تابع می تونه کتابخونه های منتشر شده توسط دیگر برنامه نویسان مثل Express یا Mongoose رو براتون بارگزاری کنه.این کتابخونه ها رو میتونین از npm دانلود و نصب کنین· با این تابع می تونین برنامه ها و فایل هایی که خودتون نوشتین رو بارگزاری کنید.این تابع پارامتر مسیر فایل رو می گیره و شی module.exports رو بر می گردونه.ماژول های نود جی اسماژول یه بلوک کد با قابلیت استفاده دوباره هست که وجودش روی کد های دیگر تاثیری نمی ذاره.موتور v8 جاوااسکریپت رو با بهره بردن از زبان C++ قدرتمند تر می کنهموتور V8 یه موتور ران تام اوپن سورس هستش که با زبان برنامه نویسی ++c نوشته شدهجاوا اسکریپت ---(V8(++C ---&gt; کد ماشینموتور V8 زبان اسکریپتی به نام ECMAScript رو که توسط استاندارد ECMA-262 تعیین میشه رو فراهم می کنه.ECMAScript توسط سازمان Ecma International که استانداردهای جاوااسکریپت رو منتشر میکنه ، ساخته شده.موتور V8 میتونه بصورت مستقل اجرا بشه یا هم می تونه با برنامه ++C دیگه ادغام بشه.این موتور اصطلاحا قلاب هایی (Hook) داره که بهتون اجازه میده تا کد های ++C خودتون رو به برنامه جاوااسکریپت خودتون اضافه کنید.این ویژگی به شما اجازه میده تا بتونین قابلیت ها و ویژگی های جدیدی رو با ادغام موتور V8 به جاوااسکریپت اضافه کنید. با این کار کد  C++ شما میتونه کارهای بیشتری از استانداردی که توسط استاندارد ECMAScript تعیین شده ، انجام بدید.البته اینو اضافه کنم که علاوه بر موتور V8 موتور های ران تایم دیگه ای وجود دارن. مثل SpiderMonkey که توسط تیم موزیلا و Chakra که توسط تیم مایکروسافت توسعه داده شدن.رویداد ها (Events)رویداد در واقع چیزی است که در اپلیکیشن ما رخ می ده و ما می تونیم به اون پاسخ بدیم.دو نوع رویداد در نود وجود داره.رویداد های سیستم :هسته ی C++ از ی کتابخونه که اصطلاحا libuv نامیده میشه . (برای مثال ،تمام شدن خواندن ی فایل)رویداد های سفارشی : هسته ی جاوا اسکریپتنوشتن برنامه Hello World در نود جی اسیه فایل به اسم app.js بسازید و کد زیر رو توش کپی کنید.console.log(&quot;Hello World!&quot;);ترمینال رو باز کنید و به پوشه ای که فایل رو توش ذخیره کردید، برید و دستور node app.js رو اجر کنید.خب شما الان اولین برنامه Hello World تون رو با نود جی اس نوشتین.ممنون از اینکه تا آخر این مقاله همراه من بودین. این اولین ترجمه من بود امیدوارم ازش راضی بوده باشین.لطفا نظر بدین.منبع  : https://medium.freecodecamp.org/what-exactly-is-node-js-ae36e97449f5</description>
                <category>جامعه نود جی اس ایران</category>
                <author>مهدی گندمی</author>
                <pubDate>Fri, 15 Feb 2019 20:52:19 +0330</pubDate>
            </item>
                    <item>
                <title>الکترون جی اس چیست ؟</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86-%D8%AC%DB%8C-%D8%A7%D8%B3-%DA%86%DB%8C%D9%87-aho1lvswm9lc</link>
                <description>الکترون یه فریمورک اوپن سورس ارائه شده توسط گیت هابه که به ما توسعه دهنده ها این امکان رو میده تا با تکنولوژی های وب (.... , html , css , javascript) اپلیکیشن های مبتنی بر دسکتاپ بنویسیم .برنامه های نوشته شده با Electronjs این قابلیت رو دارن تا روی Windows , Mac و Linux اجرا بشن و این یکی از دلایلی هست که من عاشق الکترونم .دلیل دوم محبوبیت Electronjs اینه شما از تکنولوژي های وب برای توسعه اپ با الکترون استفاده میکنید یعنی اگه شما میتونید وبسایت طراحی کنید پس میتونید تا با الکترون اپلیکیشن بنویسید .سوال : Electronjs چه جوری کار میکنه ؟الکترون برای اینکه قادر به انجام این کار باشه از Chromium که یه مرورگر اوپن سورس هست و Node Jsکه یک محیط زمان اجرای جاوااسکریپت هست استفاده میکنه . خب این عالیه . چون که ما به تمام ماژول های Node Js تو الکترون دسترسی داریم . سوال : برای یاد گرفتن Electronjs نیازه که Node Js بلد باشم ؟اگر Node Js بلدید که هیچ . ولی اگه بلدید نیستید هم میتونید شروع به یادگیری Electronjs کنید چون فرآیند استفاده از ماژول های Node Js بسیار سادس و شما هر زمان که به چیزی نیاز داشتید میتونید با یه سرچ اون ماژول موردنظر رو پیدا کنید و نحوه کار کردن با اون رو یاد بگیرید .سوال : چند تا اپلیکیشن جالب بگو که با Electronjs نوشته شده باشن چیه ؟اولیش atom هست که یه ویراشگر کد محبوب ساخته شده توسط Github هستش . یا ادیتور Visual Studio Code  هم که ساخت مایکروسافت هست و همچنین Whatsapp و Skype هم با الکترون نوشته شده خب تموم شد .لیست اپلیکیشن های نوشته شده با الکترون خوشحال نظراتتون رو در مورد مقالم بدونم و اگه سوالی داشتید بهش پاسخ بدم . اگر هم در جایی اشتباهی داشتم ممنون میشم بهم گوشزد کنید .                                                                                                         برای ارتباط بیشتر  گیت هاب   لینکداینتلگرام  ایمیل وبسایت </description>
                <category>جامعه نود جی اس ایران</category>
                <author>Arian nargesi</author>
                <pubDate>Thu, 17 Jan 2019 19:32:24 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از nodejs در کنار فریم ورک های دیگر</title>
                <link>https://virgool.io/iran-nodejs-community/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-nodejs-%D8%AF%D8%B1-%DA%A9%D9%86%D8%A7%D8%B1-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-%D9%87%D8%A7%DB%8C-%D8%AF%DB%8C%DA%AF%D8%B1-tq8m5xmfkkbo</link>
                <description>این مطلب کد نویسی ندارد و فقط به منظور تشریح بهتر موضوع نوشته شده استشاید برای خیلیا این سوال پیش بیاد که &quot;چجوری با فریم ورکی مثل جنگو ، لاراول ، روبی آن ریلز و... nodejs هم کار کنم؟&quot;خوب این سوال خیلی کامل نیست . بزار ببینیم nodejs چیه اصن  :Node.js is an open-source, cross-platform JavaScript run-time environment that executes JavaScript code outside of a browser https://en.wikipedia.org/wiki/Node.js با تعریفی که بالا هست ، nodejs یک فریم ورک نیست . یک پلتفرم جاوا اسکریپتی هست . اما اگر میخوایم برسیم به یک تعریف قشنگتر و درستر از framework های nodejs باید ببینیم که چه دسته بندی میخوایم کار کنیم . سوکت ؟ ui؟ بک اند ؟ API ؟ دیتابیس ؟حالا بحث ما اینه .آیا میشه از nodejs و Django کنار هم استفاده کرد یا نه؟ بله . چرا که نه . اما یک سری حالت رو باید بررسی کنیم :من API  رو روی Django دارم . پس ، از nodejs میتونم برای ui  استفاده کنم. چون بک اند رو با جنگو زدم . حالا میتونم فریم ورک Reactjs  رو برای ui استفاده کنم .میخوام سوکت بزنم . خوب یا باید با پایتون بزنم یا باید با nodejs بزنم . و بخش ui رو باز با react یا سیستم های دیگه بزنم . اول باید nodejs  رو کامل بشناسیم . ببینیم چه کارهایی میتونه بکنه . نه میشه گفت یک زبانه ، نه میشه گفت یک framework . اما فریم ورک هایی مثل salis و express و koa میتونن برای بخش بک اند استفاده بشن . یا با socket.io سوکتینگ رو انجام بدیم یا با Reactjs بخش UI  رو کامل کنیم . در آخر اگر مطلبم مفید بود یک فنجون قهوه مهمونم کن . حرف زیاد داریم بزنیم</description>
                <category>جامعه نود جی اس ایران</category>
                <author>نیما حبیب خدا</author>
                <pubDate>Mon, 19 Nov 2018 09:57:09 +0330</pubDate>
            </item>
            </channel>
</rss>