Node.js 17.0، پلتفرمی برای اجرای برنامه های شبکه در جاوا اسکریپت منتشر شد. Node.js 17.0 یک شعبه پشتیبانی معمولی است که تا ژوئن 2022 بهروزرسانیها را دریافت میکند. در روزهای آینده، تثبیت شعبه Node.js 16 به پایان می رسد که وضعیت LTS دریافت می کند و تا آوریل 2024 پشتیبانی می شود. تعمیر و نگهداری شاخه LTS قبلی Node.js 14.0 تا آوریل 2023 و سال قبل از آخرین شاخه LTS 12.0 تا آوریل 2022 ادامه خواهد داشت.
بهبودهای اصلی:
- موتور V8 به نسخه 9.5 آپدیت شده است.
- اجرای انواع API پایه مبتنی بر استفاده از رابط محاسباتی ناهمزمان Promise ادامه یافته است. Node.js 17.0 علاوه بر APIهای Timers Promises و Streams Promises که قبلا ارائه شده بود، Readline Promise API را برای خواندن خط به خط داده ها با استفاده از ماژول Readline معرفی می کند. import * به عنوان خط خواندن از 'node:readline/promises'; وارد کردن { stdin به عنوان ورودی، stdout به عنوان خروجی } از 'process'; const rl = readline.createInterface({ ورودی، خروجی }); const answer = await rl.question('نظر شما درباره Node.js چیست؟'); console.log('از بازخورد ارزشمند شما متشکرم: ${answer}'); rl.close();
- کتابخانه OpenSSL ارائه شده به نسخه 3.0 به روز شده است (چنگال quictls/openssl با پشتیبانی از پروتکل QUIC فعال استفاده می شود).
- نسخه Node.js را فعال کرد تا در ردیابی های پشته ای نمایش داده شود که در صورت بروز خطاهای مهلکی که باعث خاتمه برنامه می شود، خروجی می شود.
علاوه بر این، می توان به حذف دو آسیب پذیری در شاخه های فعلی Node.js (CVE-2021-22959, CVE-2021-22960) اشاره کرد که امکان انجام حملات HTTP Request Smuggling (HRS) را فراهم می کند. به ما این امکان را می دهد که در محتوای درخواست های کاربران دیگر که در همان رشته پردازش شده بین قسمت جلویی و باطن پردازش می شوند، قرار بگیریم (به عنوان مثال، کد مخرب جاوا اسکریپت را می توان در جلسه کاربر دیگری درج کرد). جزئیات بعداً فاش خواهد شد، اما در حال حاضر ما فقط می دانیم که مشکلات ناشی از مدیریت نادرست فضاهای بین نام هدر HTTP و کولون، و همچنین مدیریت متفاوت کاراکترهای بازگشت بار و تغذیه خط در بلوک پارامتر مورد استفاده در هنگام ارسال است. بدنه درخواست در بخش هایی در حالت "تکه"
به یاد بیاوریم که پلتفرم Node.js می تواند هم برای پشتیبانی سرور از برنامه های کاربردی وب و هم برای ایجاد برنامه های شبکه مشتری و سرور معمولی استفاده شود. برای گسترش کارایی اپلیکیشن ها برای Node.js، مجموعه بزرگی از ماژول ها تهیه شده است که در آن می توانید ماژول هایی با اجرای HTTP، SMTP، XMPP، DNS، FTP، IMAP، POP3 سرورها و کلاینت ها، ماژول هایی برای ادغام پیدا کنید. با چارچوب های مختلف وب، کنترل کننده های WebSocket و Ajax، اتصال دهنده ها به DBMS (MySQL، PostgreSQL، SQLite، MongoDB)، موتورهای قالب، موتورهای CSS، پیاده سازی الگوریتم های رمزنگاری و سیستم های مجوز (OAuth)، تجزیه کننده های XML.
برای اطمینان از پردازش تعداد زیادی از درخواستهای موازی، Node.js از یک مدل اجرای کد ناهمزمان مبتنی بر مدیریت رویداد غیرمسدود و تعریف کنترلکنندههای برگشت تماس استفاده میکند. روش های پشتیبانی شده برای اتصالات چندگانه عبارتند از: epoll، kqueue، /dev/poll و select. برای مالتی پلکس کردن اتصال، از کتابخانه libuv استفاده می شود که یک افزونه برای libev در سیستم های یونیکس و IOCP در ویندوز است. کتابخانه libeio برای ایجاد یک Thread Pool استفاده می شود و c-ares برای انجام پرس و جوهای DNS در حالت غیر مسدود کننده یکپارچه شده است. تمام فراخوانیهای سیستمی که باعث مسدود شدن میشوند در داخل thread pool اجرا میشوند و سپس مانند کنترلکنندههای سیگنال، نتیجه کار خود را از طریق یک لوله (لوله) بدون نام به عقب منتقل میکنند. اجرای کد جاوا اسکریپت از طریق استفاده از موتور V8 توسعه یافته توسط گوگل ارائه می شود (علاوه بر این، مایکروسافت در حال توسعه نسخه Node.js با موتور Chakra-Core است).
Node.js در هسته خود شبیه به Perl AnyEvent، Ruby Event Machine، Python Twisted و پیاده سازی رویداد Tcl است، اما حلقه رویداد در Node.js از توسعه دهنده پنهان است و شبیه مدیریت رویداد در یک برنامه تحت وب در حال اجرا است. در مرورگر هنگام نوشتن برنامه های کاربردی برای node.js، به جای انجام "var result = db.query("select..");" باید ویژگی های برنامه نویسی مبتنی بر رویداد را در نظر بگیرید. با انتظار برای اتمام کار و پردازش بعدی نتایج، Node.js از اصل اجرای ناهمزمان استفاده می کند، یعنی. کد به "db.query("انتخاب.."، تابع (نتیجه) {result processing}) تبدیل میشود، که در آن کنترل فوراً به کد بعدی منتقل میشود و نتیجه پرس و جو با رسیدن دادهها پردازش میشود.
منبع: opennet.ru