چگونه در NodeJS REPL پیشرفت کنیم؟

در این مقاله درباره ی نحوه ی پیشرفت در NodeJS REPL صحبت خواهیم کرد بنابراین در طی این پست متوجه خواهید شد که چگونه از متد های ناهمگام در کنسول NodeJS REPL استفاده کنید در نتیجه ابتدا یک معرفی خواهیم داشت و بعد کار خود را با REPL شروع خواهیم کرد.

چگونه در NodeJS REPL پیشرفت کنیم؟

معرفی

استفاده از Ruby on Rails و NodeJS به عنوان تکنیک های پس زمینه هم مزایایی دارد و هم معایبی دارد. این که دائما زبان برنامه نویسی خود را تغییر دهید و از تکنولوژی های دیگر یاد بگیرید واقعا عالی است اما البته ممکن است شما برخی از ویژگی ها را از زبانی که پشت سر گذاشته اید از دست بدهید.

در صورتی که به یادگیری اصولی و حرفه ای این تکنولوژی قدرتمند علاقمند هستید میتوانید دوره کامل و جامع آموزش Node Js موجود در سایت تاپ لرن را مشاهده کنید .

این موضوعی است که برای rails اتفاق می افتد: که کنسول را (در بین موارد دیگر) از دست می دهند. کنسول rails جایی است که همه ی متد های اپلیکیشن و اشیاء برای تعاملات در معرض قرار می گیرند. حالت کامل اپلیکیشن می تواند در اینجا ملاحظه و دستکاری شود که باعث می شود یافتن باگ ها ساده شود.

به عنوان یک توسعه دهنده ی NodeJS (عمدتا) به دنبال راهی مشابه برای مدیریت وضعیت ها و دیدن پایداری ماژول ها بدون ورود پایگاه داده هستیم بنابراین با Node REPL شروع می کنیم.

شروع با REPL

کنسول NodeJS REPL نقطه ی شروع است. تفاوت عمده ی این مورد با کنسول rail بارگذاری خودکار همه ی gem ها، کلاس ها و اشیاء دیگر است اما ما در اینجا این کار را دستی انجام خواهیم داد.

اولین چیزی که به آن احتیاج دارید این است که تصمیم بگیرید کدام یک از اشیاء یا توابع را می خواهید به نمایش بگذارید. ما تصمیم گرفته ایم که خدمات و اشیاء ORM را به نمایش بگذاریم اما شما آزادید که هر موردی که می خواهید را انتخاب کنید.

دیدگاه اول یک فایل خدمات مورد نیاز زمان راه اندازی کنسول است:

بنابراین اجازه دهید با ساخت یک `console.js` شروع کنیم. با REPL شروع می کنیم و اشیاء خودمان را به آن اضافه می کنیم:

const repl = require('repl'),
 fs = require('fs'),
 pjson = require('./package.json'),
 orm = require('./app/orm');

orm.init().then(() => {
 const replServer = repl.start({
   prompt: `${pjson.name}> `
 });
 replServer.context.orm = orm;
 const servicesPath = './app/services/';
 fs.readdir(servicesPath, (err, files) => {
   files.forEach(file => {
   	replServer.context[`${file.split('.')[0]}Service`] = require(`${servicesPath}${file}`);
   });
 });
});

شما می توانید این برنامه را با `node console.js` اجرا کنید.

اینجا به تمام فایل های سرویس نیاز دارید بنابراین آن ها را به محتوای REPL به صورت زیر اضافه کنید:

Service” + نام فایل

توجه کنید از آنجایی که ما با مدل MVC کار می کنیم سرویس ها یکی از مواردی هستند که نه تنها عامل تعامل با پایگاه داده هستند بلکه عامل تعامل با هر سرویس خارجی نیز هستند. Integration ها با موارد پیچیده ای تست خودکار را پیاده می کنند بنابراین ما با نمایش آن ها در کنسول به دنبال راه حل ساده تری هستیم. در تعامل باشید و نتیجه را ببینید.

مشکل

در express js bootstrap ، ما یک مثال از اپلیکیشن MVC با کاربران و کتاب ها داریم. ما در تلاش برای گرفتن خدمات کاربران برای گرفتن یک کاربر از پایگاه داده هستیم.

ما می توانیم ببینیم که کوئری اجرا شده است ولی هیچ نتیجه ای نشان داده نشده است. متد های سرویس های ما، Promise ها را برمی گرداند و ما برای دیدن نتیجه، promise ها را حل خواهیم کرد.

بنابراین آیا ما باید این کار را هر بار که می خواهیم متد سرویس را بررسی کنیم انجام دهیم؟ واضح است که یک راه بهتر نیز وجود دارد: استفاده از Async/Await

راه حل

ما می خواهیم متد های سرویس را طوری تبدیل کنیم که به صورت " همزمان " به نظر برسد. یک تابع async، نتیجه await  تعریف کنید و آن را return کنید . حال کد به شکل زیر خواهد بود:

const repl = require('repl'),
 fs = require('fs'),
 pjson = require('./package.json'),
 orm = require('./app/orm');

const convertFunctionToAsync = f => {
 return async (...args) => {
   const result = await f(...args);
   console.log(JSON.stringify(result, null, 2));
 };
};

const convertObjectFunctionsToAsync = serviceMethods => {
 const asyncServiceMethods = {};
 Object.keys(serviceMethods).forEach(key => {
   if (typeof serviceMethods[key] === 'function') {
     asyncServiceMethods[key] = convertFunctionToAsync(serviceMethods[key]);
   } else {
     asyncServiceMethods[key] = serviceMethods[key];
   }
 });
 return asyncServiceMethods;
};

orm.init().then(() => {
 const replServer = repl.start({
   prompt: `${pjson.name}> `
 });
 replServer.context.orm = orm;
 const servicesPath = './app/services/';
 fs.readdir(servicesPath, (err, files) => {
   files.forEach(file => {
     const serviceMethods = require(`${servicesPath}${file}`);
     const asyncServiceMethods = convertObjectFunctionsToAsync(serviceMethods);
     replServer.context[`${file.split('.')[0]}Service`] = asyncServiceMethods;
   });
 });
});

اجازه دهید آن را امتحان کنیم.