routing در express – بخش دوم
در بخش اول از آموزش routing در فریمورک express.js مواردی از جمله دریافت درخواست و ارسال پاسخ توسط متد get رو مورد بررسی قرار دادیم. در بخش دوم این آموزش ۵ مورد زیر رو بررسی میکنیم:
۱- ارسال اطلاعات به صفحات
۲- استفاده از چندین تابع برای یک route
3- استفاده از متد post
4- استفاده از متد all
5- استفاده از express.Router
با ما همراه باشید.
۱- ارسال اطلاعات به صفحات
در قسمت قبل یاد گرفتیم که با استفاده از کد زیر میتونیم صفحهای رو برای کاربر بفرستیم. در خط اول نوع view engine رو تعیین کردیم. از خط دوم به بعد گفتیم که اگر کاربر آدرس صفحهی اول سایت رو وارد کرد، صفحهای به نام index رو برای اون ارسال کن (این صفحه در فولدر view قرار دارد).
app.set('view engine', 'ejs'); app.get('/', function(req, res) { res.render('index'); });
فرض کنید بخوایم آدرسی که کاربر بعد از اسلش(/) وارد میکند رو به عنوان متغیری به اسم title به صفحمون ارسال کنیم، برای اینکار کد زیر رو مینویسیم:
app.get('/:title', function(req, res) { res.render('index', {title: req.params.title}); });
در خط اول گفتیم که کاربر هرچی بعد از / وارد کرد رو به عنوان متغیر title به params اضافه کن؛ در خط دوم گفتیم که متغیر title رو به صفحهی index بفرست و بعد از render شدن این صفحه، اون رو برای کاربر بفرست.
حالا نمونهای از صفحهی ارسالی (در اینجا index) به کاربر رو باهم میبینیم:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><%= title %></title> </head> <body> </body> </html>
این صفحه با پسوند ejs ذخیره شده. همه چیز شبیه html هست به جز خط پنجم. در خط پنجم با دستور زبان ejs به صفحه گفتیم که مقدار متغیر title رو در تگ title قرار بده.
۲- استفاده از چندین تابع برای یک route
به طور عادی تابعی که برای یک route خاص در نظر گرفته شده بعد از اتمام خطهای کد موجود در اون، کار با اون route رو به اتمام میرسونه و کنترل رو به برنامه اصلی برمیگردونه. برای اینکه بعد از اتمام تابع، کنترل را به یک تابع دیگر منتقل کنیم، میتونیم از next استفاده کنیم. به شکل زیر:
function f1(req, res, next) { console.log('func 1'); next(); } function f2(req, res) { console.log('func 2'); res.render('index', { title: req.params.title }); } app.get('/', [f1, f2]);
در اینجا دو تابع به اسمهای f1 و f2 تعریف کردیم و همون پارامترهایی که به تابع route میفرستادیم رو به اونها میفرستیم؛ به علاوهی اینکه به تمام تابعها به غیر از آخری پارامتر next رو میفرستیم و در آخر تابع اون رو فراخونی میکنیم. در قدم بعدی این تابعها رو در یک آرایه به app.get میفرستیم (خط آخر).
کاربرد next به اینصورت هست که در هرجایی فراخونی بشه، کنترل رو تحویل تابع بعدی میده.
۳- استفاده از متد post
استفاده از post شبیه همان get هست و به جای نوشتن app.get از app.post استفاده میکنیم. یکی از استفادههای معمول از post به این صورت است که اطلاعاتی در قالب آبجکت به سرور فرستاده میشود و اطلاعاتی در همین قالب به عنوان پاسخ دریافت میشود. در زیر نمونهای از این مثال را میبینیم:
app.post('/auth', function(req, res) { var info = { status: 0, error: '' }; if (req.params.email.length > 0) { if (req.params.password.length > 0) { info.status = 1; info.error = ''; } else { info.status = 0; info.error = 'password is required'; } } else { info.status = 0; info.error = 'email is required'; } res.send(info); });
در این مثال email و password توسط متد post به آدرس auth فرستاده میشوند و بعد از بررسی آبجکتی حاوی status و error به کاربر فرستاده میشود.
۴- استفاده از متد all
این متد به عنوان middleware برای تمام درخواستهای http برای یک route خاص عمل میکند. مثال زیر رو ببینید:
app.all('/test', function(req, res, next) { console.log('test is here'); next(); });
برای اینکه بعد از اجرا کنترل رو به تابع بعدی بدهیم از متد next هم استفاده میکنیم.
۵- استفاده از express.Router
گاهی نیاز داریم تا تمام routeها رو در قالب یک ماژول بنویسیم. برای اینکار میتوانیم از router استفاده کنیم. این کار به کم شدن افزونگی و پیچیدگی کد ما نیز کمک شایانی میکند. مثال زیر رو نگاه کنید:
var express = require('express'); var router = express.Router(); router.get('/', function(req, res) { console.log('here is somewhere ... '); res.send('home'); }); router.get('/info', function(req, res) { res.render('sInfo'); }); module.exports = router;
در اینجا ابتدا express رو import میکنیم. سپس مقدار بازگشتی از فراخونی تابع Router رو در آبجکتی ذخیره میکنیم. از اینجا به بعد همون کارهای قبلی که برای routing انجام میدادیم رو انجام میدیم؛ با این تفاوت که به جای app از اسم آبجکتی که ساختیم استفاه میکنیم. مثلا به جای app.get مینویسیم router.get و به همین منوال برای بقیه routeها. در آخر هم به خاطر اینکه قرار هست این کد به عنوان ماژول مورد استفاده قرار بگیرد از module.exports استفاده میکنیم.
برای استفاده از این ماژول هم به شکل زیر عمل میکنیم:
var sRoutes = require('./sRoutes'); app.use('/somewhere', sRoutes);
ایتدا این ماژول رو import میکنیم (فرض بر اینکه ماژول خودمون رو به اسم sRoutes.js ذخیره کردیم). خط دوم کد بالا یعنی تمام routeهایی که در فایل sRoutes تعریف کردیم رو به بخش somewhere متصل کن. از الان به بعد هرزمانی somewhere/info وارد شود، وارد صفحهی sInfo میشویم. یعنی تمام routeهایی که تعریف کردیم مربوط به زیرشاخهی somewhere میشوند.
برای اطلاعات بیشتر میتونید به مستندات express مراجعه کنید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.