از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
چگونه Express.js Middleware بنویسیم آیا تا به حال فکر کرده اید که چه خبر است؟ روی در تمام میان افزار Express.js که به برنامه وب خود اضافه می کنید؟ در واقع بسیار چشمگیر است که چه نوع عملکردی را می توانید فقط با یک خط کد یا چند خط به برنامه های خود اضافه کنید: // نیاز دارد… var app = express(); app.use("…
سرفصلهای مطلب
معرفی
آیا تا به حال تعجب کرده اید که چه خبر است؟ روی در تمام میان افزار Express.js که به برنامه وب خود اضافه می کنید؟ در واقع بسیار چشمگیر است که چه نوع عملکردی را می توانید تنها با یک خط کد یا چند خط به برنامه های خود اضافه کنید:
// requires...
var app = express();
app.use("/static", express.static(__dirname + "/public"));
app.use(cookieParser('sekret'));
app.use(compress());
سه خط آخر بالا مقدار زیادی از عملکرد برنامه وب را برای ما انجام می دهد. اولین app.use()
call به Express میگوید که فایلهای استاتیک ما در کجا قرار دارند و چگونه آنها را در معرض نمایش قرار دهیم cookieParser('sekret')
میانافزار تمام تجزیه کوکیها را انجام میدهد (با رمزگذاری)، و آخرین مورد به طور خودکار gzip تمام دادههای بدنه HTTP ما را فشرده میکند. فقط برای سه خط کد بد نیست.
این میانافزارها در برنامههای وب متوسط شما معمولی هستند، اما میتوانید برخی از آنها را پیدا کنید که بیش از فشردهسازی استاندارد داده یا تجزیه کوکیها انجام میدهند. اینها را برای مثال در نظر بگیرید:
- کلاه ایمنی: با تنظیم سرصفحه های مختلف HTTP به ایمن سازی برنامه شما کمک می کند
- express-simple-cdn: به راحتی از یک CDN برای دارایی های ثابت خود استفاده کنید
- join-io: به فایل ها بپیوندید روی پرواز برای کاهش تعداد درخواست های HTTP
- پاسپورت: احراز هویت کاربر را به مسیرهای انتخابی اضافه می کند
و اینجا لیست بسیار بزرگتری از میان افزارها است که ممکن است بخواهید از آن استفاده کنید.
اکنون که چند نمونه را دیدید، در اینجا تقریباً هر کاری که می توانید با آن انجام دهید آورده شده است:
- هر کدی از جمله کدهای ناهمزمان را اجرا کنید
- تغییرات یا اضافاتی را در اشیاء درخواست و پاسخ ایجاد کنید
- چرخه درخواست-پاسخ را پایان دهید
- میان افزار بعدی را در پشته فراخوانی کنید
با امکانات بی پایان، مطمئن هستم که شما ایده هایی از خود دارید که می خواهید ایجاد کنید، بنابراین در ادامه این مقاله به شما نشان خواهم داد که چگونه میان افزار خود را بنویسید. چند نوع مختلف میان افزار وجود دارد که می توانید بنویسید (برنامه، روتر، مدیریت خطا، و غیره)، اما در این مقاله ما فقط تمرکز می کنیم روی سطح برنامه
اصول اولیه
میان افزار را می توان تقریباً به گونه ای تصور کرد که گویی یک مسیر اکسپرس است. آنها همان پارامترها و همه چیز را می گیرند، اما بر خلاف مسیرهای معمولی، شما نیازی به ارائه مسیر URL برای میان افزار ندارید. دو تفاوت بزرگ در روش برخورد با مسیر و زمان فراخوانی آن است.
مسیر ارائه شده به عنوان یک پیشوند در نظر گرفته می شود، بنابراین اگر چیزی شبیه به آن داشتید app.use('/api', ...)
، سپس میان افزار شما اجرا خواهد شد if /api
نامیده میشود و اگر /api/users
نامیده میشود. این با مسیرهایی که مسیر باید دقیقاً مطابقت داشته باشد متفاوت است.
مسیر URL را می توان از قسمت حذف کرد app.use()
اگر میخواهید کد شما برای همه درخواستها اجرا شود، تماس بگیرید، در غیر این صورت میتوانید یک مسیر را مشخص کنید و کد شما فقط زمانی اجرا شود که آن مسیر (و همه مسیرهای فرعی آن) درخواست شود. برای مثال، این ممکن است برای افزودن احراز هویت تنها به چند مسیر معین مفید باشد.
یک میان افزار ساده ممکن است به شکل زیر باشد:
var app = express();
app.use(function(req, res, next) {
console.log('Called URL:', req.url);
next();
});
در حالی که یک route handler به شکل زیر است:
var app = express();
app.get('/', function(req, res, next) {
res.send('Hey there...');
});
دیدن؟ آنها اساساً یک چیز هستند، بنابراین نوشتن این توابع باید برای شما کاملاً آشنا باشد.
پارامترهای مورد استفاده عبارتند از:
req
: یک شی حاوی تمام اطلاعات درخواست مربوطه. این می تواند هر چیزی از URL درخواست شده تا متن درخواست POST تا آدرس IP کاربر باشد.res
: این شیء پاسخ است که برای ارسال اطلاعات به کاربر برای درخواست داده شده استفاده می شود. میتوانید از این برای ارسال کد پاسخ HTTP 404 یا برای بازگرداندن HTML رندر شده از طریق استفاده کنید.res.render()
.next
: و در نهایت،next
پارامتر یک تماس برگشتی است تا زمانی که میان افزار ما تمام شد به Express بگویید. اگر هر IO (مانند تماس های پایگاه داده) یا محاسبات سنگین را انجام می دهید، احتمالاً باید عملکرد را ناهمزمان کنید تا از مسدود شدن رشته اصلی اجرایی جلوگیری کنید، در این صورت باید از آن استفاده کنید.next
.
شایان ذکر است که اگر میان افزار شما چرخه درخواست-پاسخ را با آن پایان ندهد res.end(...)
سپس شما باید زنگ زدن next()
برای انتقال کنترل به میان افزار بعدی. اگر این کار را انجام ندهید، درخواست معلق باقی میماند و به پایان میرسد.
یک مثال
در این مثال ما میانافزاری ایجاد میکنیم که به شما کمک میکند متن را بهطور خودکار بین زبانها ترجمه کنید. اگرچه این یک ماژول معمولی i18n نیست، ما به جای آن از Google Translate استفاده خواهیم کرد.
فرض کنید یک برنامه چت ساخته اید که به شما امکان می دهد با مردم در سراسر جهان صحبت کنید، و برای اینکه آن را یکپارچه کنید، باید متن به صورت خودکار ترجمه شود. در این مورد، اکثر ماژولهای i18n کار نمیکنند، زیرا شما باید همه رشتهها را از قبل ترجمه کنید، که ما نمیتوانیم این کار را انجام دهیم زیرا با ورودی کاربر سروکار داریم.
مطمئناً، میتوانید ترجمه را در هر یک از مسیرهای اکسپرس خود انجام دهید، یا میتوانید آن را در میانافزار برایتان مدیریت کنید، که کد مسیر شما را پاکتر نگه میدارد و از فراموش کردن اضافه کردن ترجمه به هر مسیری که به آن نیاز دارد جلوگیری میکند.
رشتهها (پیامهای کاربر) از طریق یک REST API وارد میشوند، بنابراین ما باید تمام بدنههای مسیرهای API را برای ترجمه متن بررسی کنیم. تمام رشتههایی که در تماسهای POST در پایگاه داده ذخیره میشوند به زبان مادری خود نگهداری میشوند، اما تمام رشتههایی که با فراخوانهای GET از پایگاه داده بازیابی میشوند به زبان مشخصشده در هدر HTTP Accept-Language ترجمه میشوند که همراه با درخواست کاربر است.
من فکر کردم که همه پیامهای پایگاه داده را به یک زبان نمیسازیم، زیرا باید برخی از آنها را دو بار ترجمه کنیم. کیفیت ترجمه را پایین می آورد.
ابتدا اجازه دهید یک تابع ساده برای فراخوانی Google Translate API بنویسیم:
var googleTranslate = require('google-translate')('YOUR-API-KEY');
var translate = function(text, lang, cb) {
googleTranslate.translate(text, lang, function(err, translation) {
if (!translation) cb(err, null);
cb(err, translation.translatedText);
});
}
سپس از آن تابع در کد میانافزار خود استفاده میکنیم که در آن صادر میشود modules.export
برای استفاده توسط برنامه
module.exports = function(req, res, next) {
if (req.method === 'GET') {
var lang = 'en';
var langs = req.acceptsLanguages();
if (langs(0) !== '*') {
if (langs(0).length > 2) {
// ex: en-US
lang = langs(0).substring(0, 2);
} else {
// ex: en
lang = langs(0);
}
}
if (lang !== res.body.lang) {
return translate(res.body.message, lang, function(err, translation) {
res.body.message = translation;
res.body.lang = lang;
next();
});
}
}
next();
};
توجه داشته باشید: واقعاً اینگونه نیست که a را اصلاح می کنید Response
بدن من فقط برای اختصار آن را ساده می کنم. اگر می خواهید ببینید که چگونه بدنه را واقعاً اصلاح کنید، آن را بررسی کنید فشرده سازی میان افزار، که آن را به درستی انجام می دهد. شما باید پروکسی کنید res.write
و res.end
توابع، که من انجام ندادم زیرا صرفاً باعث حواس پرتی از مفاهیمی است که می خواهم در اینجا نشان دهم.
و در نهایت، ما میان افزار را به برنامه خود اعمال می کنیم. فقط مطمئن شوید که با آن تماس بگیرید app.use
تابع بعد از شما قبلا مسیرهای خود را اعلام کرده اید. ترتیب فراخوانی آن ترتیب اجرای هر تابع است.
همچنین حتما تماس بگیرید next()
در هر یک از شما /api
مسیرها، در غیر این صورت میان افزار اجرا نمی شود.
var expressGoogleTranslate = require('my-translation-middleware');
var app = express();
app.get('/api/message', function(req, res, next) {...});
app.get('/api/message/all', function(req, res, next) {...});
app.post('/api/message', function(req, res, next) {...});
app.delete('/api/message/id', function(req, res, next) {...});
app.use('/api', expressGoogleTranslate);
و این تمام چیزی است که در آن وجود دارد. هر رشته ای در Response
متنی که زبانی متفاوت از آنچه کاربر می پذیرد، توسط Google Translate ترجمه می شود، که تشخیص می دهد متن مبدأ به کدام زبان است.
بنابراین اگر پاسخ ما به این شکل شروع شد …
{
"message": "The quick brown fox jumps over the lazy dog"
"lang": "en"
}
… و کاربر فقط زبان سواحیلی را می پذیرد، سپس پس از اجرای میان افزار، ترجمه نهایی را دریافت خواهیم کرد که به شکل زیر است:
{
"message": "Haraka kahawia mbweha anaruka juu ya mbwa wavivu"
"lang": "sw"
}
نتیجه
اگرچه ممکن است ترسناک به نظر برسد، اما میان افزارها ترسناک هستند واقعا ایجاد آسان در Express شما می توانید آن را برای هر چیزی، صرف نظر از اینکه چقدر ساده یا پیچیده باشد، استفاده کنید.
فقط مطمئن شوید که یک جستجوی سریع انجام دهید روی npm برای هر آنچه که میخواهید بسازید، زیرا هزاران کد قبلاً در دسترس است. من مطمئن هستم که بسته ای در حال حاضر وجود دارد که همان کاری را که کد ترجمه من انجام می دهد (و احتمالاً بسیار بهتر) انجام می دهد.
آیا ایده ای برای ایجاد میان افزار دارید یا اینکه چگونه می توان مثال من را در بالا بهبود بخشید؟ در نظرات به ما اطلاع دهید!
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-29 17:05:08