1. التثبيت
انسخ الرمز على النحو التالي: $ NPM Install Express
أو استخدم Exextable Express (1) في أي مكان للتثبيت:
انسخ الرمز كما يلي:/# مترجم ملاحظة: يوصى بشدة بهذه الطريقة
$ NPM Install -G Express
2. ابدأ بسرعة
أسرع طريقة للبدء في Express هي استخدام Exextable Express (1) لإنشاء تطبيق ، كما هو موضح أدناه:
إنشاء تطبيق:
نسخة الكود كما يلي:
$ NPM Install -G Express
$ express /tmp /foo && cd /tmp /foo
تثبيت حزمة التبعية:
نسخة الكود كما يلي:
$ NPM تثبيت -D
بدء الخادم:
نسخة الكود كما يلي:
$ node app.js
3. إنشاء خادم
لإنشاء مثيل express.httpserver ، ما عليك سوى الاتصال بالطريقة CreateServer (). بالنسبة إلى مثال التطبيق هذا ، يمكننا تحديد مسار استنادًا إلى إجراءات HTTP (أفعال HTTP) ، وأخذ app.get () كمثال:
نسخة الكود كما يلي:
var app = require ('express'). streeServer () ؛
app.get ('/' ، function (req ، res) {
Res.Send ('Hello World') ؛
}) ؛
app.listen (3000) ؛
4. إنشاء خادم HTTPS
تهيئة مثيل express.httpsserver على النحو الوارد أعلاه. ثم نقوم بتمريره كائن تكوين ، وقبول المفتاح ، و CERT ، وغيرها من (الخصائص/الأساليب) المذكورة في وثائق HTTPS.
نسخة الكود كما يلي:
var app = require ('express'). streeServer ({key: ...}) ؛
خامسا التكوين
يدعم Express أي بيئة ، مثل مرحلة المنتج ومرحلة التطوير. يمكن للمطورين استخدام طريقة التكوين () لتعيين البيئة الحالية المطلوبة. إذا كانت المكالمة لتكوين () لا تحتوي على أي اسم بيئة ، فسيتم تشغيلها على رد الاتصال المحدد في جميع البيئات.
ملاحظة المترجم: يمكن أن تؤخذ الأسماء المستعارة مثل الإنتاج/التطوير/المرحلة بأنفسهم ، كما هو موضح في App.Configure في application.js. انظر المثال التالي للاستخدام الفعلي.
المثال التالي فقط DumpExceptions (رمي الأخطاء) في مرحلة التطوير ويعيد استثناء المكدس. ومع ذلك ، في كلتا البيئتين نستخدم MethodOverride و Bodyparser. انتبه إلى استخدام App.Router ، والذي يمكن (اختياري) استخدامه لتحميل مسار البرنامج. بالإضافة إلى ذلك ، سيتم أيضًا تحميل المسار عن طريق الاتصال App.get () و App.post () ، وما إلى ذلك لأول مرة.
نسخة الكود كما يلي:
app.configure (function () {
app.use (express.methodoverride ()) ؛
app.use (express.bodyParser ()) ؛
app.use (app.router) ؛
}) ؛
App.Configure ('Development' ، function () {
app.use (express.static (__ dirname + '/public')) ؛
app.use (express.errorHandler ({dumpexceptions: true ، showstack: true})) ؛
}) ؛
App.Configure ('Production' ، function () {
var Oneyear = 31557600000 ؛
app.use (express.static (__ dirname + '/public' ، {maxage: oneyear})) ؛
app.use (express.errorHandler ()) ؛
}) ؛
لبيئات مماثلة ، يمكنك تمرير سلاسل بيئة متعددة:
نسخة الكود كما يلي:
App.Configure ('Stage' ، 'Prod' ، function () {
// التكوين
}) ؛
بالنسبة لأي إعدادات داخلية (#) ، يوفر Express مجموعة (مفتاح [، VAL]) ، تمكين (مفتاح) وتعطيل (مفتاح) الطرق:
ملاحظة المترجم: للحصول على التفاصيل ، يرجى الرجوع إلى: application.js app.set.
نسخة الكود كما يلي:
app.configure (function () {
App.set ('Views' ، __dirName + '/views') ؛
app.set ('Views') ؛
// => "/absomute/path/to/iews"
App.enable ('بعض الميزات') ؛
// يعادل: app.set ('بعض الميزات' ، صواب) ؛
app.disable ('بعض الميزات') ؛
// يعادل: app.set ('بعض الميزات' ، خطأ) ؛
App.endabled ('بعض الميزات')
// => خطأ
}) ؛
لتغيير البيئة ، يمكننا تعيين متغيرات البيئة Node_env ، مثل:
نسخة الكود كما يلي:
$ node_env = عقدة الإنتاج app.js
هذا مهم للغاية لأن معظم آليات التخزين المؤقت يتم تشغيلها فقط خلال مرحلة المنتج.
6. الإعدادات
يدعم Express إعدادات الاختصار التالية (خارج الصندوق):
1. يتم استخدام BASEPATH لمسار قاعدة التطبيق من res.redirect () ، والذي يعالج بشكل صريح التطبيقات المثبتة.
2. عرض عرض الدليل الجذر الافتراضي هو CWD/Views
3. عرض المحرك لا يتطلب معالجة محرك العرض الافتراضية (ملفات العرض) استخدام اللواحق
4. عرض ذاكرة التخزين المؤقت تمكين عرض ذاكرة التخزين المؤقت (ممكّن في مرحلة المنتج)
5. Charchet Changes الترميز ، الافتراضي هو UTF-8
6. المسارات الحساسة للطرق حساسة للحالة
7. بعد تمكين توجيه الطبقات (في المسار) لن يتم تجاهله/لن يتم تجاهله (ملاحظة الترجمة: هذا هو ، app.get ('/sofish') و app.get ('/sofish/') سيكون مختلفًا)
8.JSON Callback Enable Res.Send () / res.json () دعم JSONP الصريح (دعم JSONP الشفاف)
7. التوجيه
يستخدم Express إجراءات HTTP لتوفير مجموعة من واجهات برمجة التطبيقات السريعة والتعبيرية. على سبيل المثال ، إذا كنت ترغب في التعامل مع حساب مع مسار /مستخدم /12 ، فيمكننا تحديد المسار على النحو التالي. يمكن الوصول إلى القيمة المرتبطة بالأصحاب النائب المسماة بواسطة req.params.
نسخة الكود كما يلي:
app.get ('/user/: id' ، function (req ، res) {
res.send ('user' + req.params.id) ؛
}) ؛
المسار عبارة عن سلسلة يتم تجميعها داخليًا في العادية. على سبيل المثال ، عندما يتم تجميع /user /: معرف ، فإن إصدار مبسط من التعبير العادي تقريبًا كما يلي:
نسخة الكود كما يلي:
// تعديل السلسلة الرسمية
/// user // ([^//]+) //؟/
يمكن تمرير التعبيرات العادية وتطبيقها على السيناريوهات المعقدة. نظرًا لأن مجموعات المحتوى التي تم التقاطها عن طريق التعبيرات العادية الحرفية مجهولة ، فقد نصل إليها مباشرة من خلال req.params. لذلك ، ستكون المجموعة الأولى من المحتوى الذي نلتقطه هو req.params [0] ، في حين أن المجموعة الثانية تتبعها على الفور req.params [1].
نسخة الكود كما يلي:
app.get (/^// users؟ (؟: // (/d+) (؟: /./. (/d+))؟/، function (req ، res) {
Res.Send (req.params) ؛
}) ؛
طلبات Curl للمسار المحدد أعلاه:
نسخة الكود كما يلي:
$ curl http: // dev: 3000/user
[NULL ، NULL]
$ curl http: // dev: 3000/user
[NULL ، NULL]
$ curl http: // dev: 3000/user/1
["1" ، خالية]
$ curl http: // dev: 3000/user/1..15
["1" ، "15"]
فيما يلي بعض الأمثلة على الطرق المرتبطة بالمسارات التي قد يستخدمونها:
نسخة الكود كما يلي:
"/user/: id"
/المستخدم/12
"/المستخدمون/: معرف؟"
/المستخدمين/5
/المستخدمين
"/ملفات/*"
/files/jquery.js
/files/javascripts/jquery.js
"/ملف/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/المستخدم/: معرف/: العملية؟"
/المستخدم/1
/المستخدم/1/تحرير
"/products.:format"
/products.json
/products.xml
"/products.:format؟"
/products.json
/products.xml
/منتجات
"/user/:ID.:Format؟"
/المستخدم/12
/user/12.json
على سبيل المثال ، يمكننا استخدام Post لإرسال بيانات JSON ، واستخدام BodyParser ، وهو برنامج وسيط يمكنه تحليل محتوى طلب JSON (أو محتوى آخر) لإرجاع البيانات ، وتخزين نتيجة الإرجاع في req.body:
نسخة الكود كما يلي:
var express = require ('Express')
، app = express.createserver () ؛
app.use (express.bodyParser ()) ؛
app.post ('/' ، function (req ، res) {
Res.Send (req.body) ؛
}) ؛
app.listen (3000) ؛
عادةً ما يمكننا استخدام العنصر النائب "Fool"-مثل المستخدم/: معرف ، بدون قيود (اسم). ومع ذلك ، على سبيل المثال ، إذا كنا نرغب في الحد من معرف المستخدم ليكون رقمًا فقط ، فقد نستخدم /مستخدم /: معرف ([0-9]+) ، والذي سيصبح ساري المفعول فقط إذا كان العنصر النائب يحتوي على رقم واحد على الأقل (التكيف ، مطابقة).
8. مرور التحكم في المسار
يمكننا التحكم في المسار المقبل التالي عن طريق استدعاء الدالة الثالثة ، NEXT (). إذا لم يتم العثور على التكيف ، فسيتم تمرير التحكم مرة أخرى للاتصال ، وسيتم استدعاء البرامج الوسيطة بالتسلسل بالترتيب المضافة قيد الاستخدام (). ينطبق المبدأ أيضًا على طرق متعددة محددة على نفس المسار ، وسيتم استدعاؤها بدورها حتى لا يتصل أحدها التالي () ويقرر تقديم استجابة طلب.
نسخة الكود كما يلي:
app.get ('/user/: id؟' ، function (req ، res ، next) {
var id = req.params.id ؛
if (id) {
// افعل شيئًا
} آخر {
التالي()؛
}
}) ؛
app.get ('/user' ، function (req ، res) {
// افعل شيئًا آخر
}) ؛
يمكن لـ App.all () أن تنقل طريقة نفس المنطق بسهولة إلى جميع إجراءات HTTP عن طريق الاتصال به مرة واحدة. بعد ذلك ، نستخدمه لاستخراج مستخدم من البيانات الزائفة وتعيينه إلى req.user.
نسخة الكود كما يلي:
var express = require ('Express')
، app = express.createserver () ؛
var users = [{name: 'tj'}] ؛
app.all ('/user/: id/: op؟' ، function (req ، res ، next) {
req.user = المستخدمين [req.params.id] ؛
if (req.user) {
التالي()؛
} آخر {
التالي (خطأ جديد (لا يمكن العثور على المستخدم " + req.params.id)) ؛
}
}) ؛
app.get ('/user/: id' ، function (req ، res) {
Res.Send ('Viewing' + req.user.name) ؛
}) ؛
app.get ('/user/: id/edit' ، function (req ، res) {
Res.Send ('editing' + req.user.name) ؛
}) ؛
app.put ('/user/: id' ، function (req ، res) {
Res.Send ('Update' + req.user.name) ؛
}) ؛
app.get ('*' ، function (req ، res) {
Res.Send (404 ، "ماذا ؟؟؟") ؛
}) ؛
app.listen (3000) ؛
9. الوسيطة
عادةً ما تكون الوسيطة الوسيطة (الخصائص) المستخدمة مصحوبة بخادم اتصال منتظم يتم تمريره إلى Express.Createserver (). يحب:
نسخة الكود كما يلي:
var express = require ('Express') ؛
var app = express.createserver (
Express.Logger ()
، Express.BodyParser ()
) ؛
بالإضافة إلى ذلك ، ضمن كتلة التكوين () - هذا القصر التقدمي (ملاحظة المترجم: يضحك ^ ^، بطريقة تدريجية) ، يمكننا أيضًا استخدام استخدام () بشكل مناسب لإضافة البرامج الوسطى.
نسخة الكود كما يلي:
app.use (express.logger ({format: ': الطريقة: url'})) ؛
عادة ، باستخدام البرامج الوسيطة التي قد تستخدمها ("الاتصال") ، مثل هذا:
نسخة الكود كما يلي:
var connect = require ('connect') ؛
app.use (connect.logger ()) ؛
app.use (connect.bodyParser ()) ؛
هذا غير سار إلى حد ما إلى حد ما ، لذلك يعرب عن تصدير هذه الخصائص الوسيطة ، على الرغم من أنها متشابهة:
نسخة الكود كما يلي:
app.use (express.logger ()) ؛
app.use (express.bodyParser ()) ؛
ترتيب الوسيطة مهم للغاية. عندما يتلقى Connect طلبًا ، فإن أول برامج الوسيطة التي نمررها إلى Correeserver () أو الاستخدام () ستصاحب بثلاث معلمات وطلب واستجابة ووظيفة رد الاتصال (عادةً التالي). عندما يتم استدعاء NEXT () ، سيكون الدوران الثاني للوسيط ، وهكذا. هذا يستحق الإشارة لأن العديد من الأدوات الوسطى تعتمد على بعضها البعض. على سبيل المثال ، يقوم MethodOverRide () باستعلام طريقة req.body للكشف عن تحميل طريقة HTTP. من ناحية أخرى ، يقوم BodyParser () بتوزيع المحتوى المطلوب ويخزنه في req.body. مثال آخر هو تحليل ملفات تعريف الارتباط ودعم الجلسة. يجب علينا أولاً استخدام () cookieparser () ثم الجلسة ().
تتضمن العديد من التطبيقات السريعة مثل هذا الخط من app.use (app.router) ، والذي قد يبدو غريباً بعض الشيء. في الواقع ، إنها مجرد وظيفة الوسيطة التي تحتوي على جميع قواعد التوجيه المحددة وتؤدي عمليات البحث في التوجيه بناءً على طلبات URL الحالية وطرق HTTP. يتيح لك Express تحديد موقعه ، ولكن بشكل افتراضي يتم وضعه في الأسفل. من خلال تغيير موقع المسار ، يمكننا تغيير أولوية البرامج الوسيطة ، على سبيل المثال ، نريد استخدام تقرير الخطأ كآخر برامج وسيطة بحيث يمكن التعامل مع أي استثناء تم نقله إلى التالي () ؛ أو نريد أن تكون خدمة الملفات الثابتة أولوية أقل للسماح لمسارنا بالاستماع إلى تنزيلات طلب ملف ثابت واحد ، وما إلى ذلك.
نسخة الكود كما يلي:
app.use (express.logger (...)) ؛
app.use (express.bodyParser (...)) ؛
app.use (express.cookieparser (...)) ؛
app.use (express.session (...)) ؛
app.use (app.router) ؛
app.use (express.static (...)) ؛
app.use (express.errorHandler (...)) ؛
أولاً ، نضيف Logger () ، والتي قد تحتوي على طريقة req.end () للعقدة ، ونقدم بيانات عن وقت الاستجابة لدينا. سيتم تحليل محتوى الطلب (إذا كانت هناك بيانات) ، تليها دقة ملفات تعريف الارتباط ودعم الجلسة. في الوقت نفسه ، سيتم تعريف req.session عندما يتم تشغيل المسار في App.Router. في هذا الوقت ، لا ندعو NEXT () ، لذلك لن تعرف الوسيطة الثابتة () هذا الطلب. إذا تم تعريف المسار التالي ، فيمكننا تسجيل حالات مختلفة ، ورفض التنزيلات ، واستهلاك نقاط التنزيل ، إلخ.
نسخة الكود كما يلي:
var downloads = {} ؛
app.use (app.router) ؛
app.use (express.static (__ dirname + '/public')) ؛
app.get ('/*' ، function (req ، res ، next) {
ملف var = req.params [0] ؛
التنزيلات [ملف] = التنزيلات [ملف] || 0 ؛
التنزيلات [ملف] ++ ؛
التالي()؛
}) ؛
10. توجيه الوسيطة
يمكن أن يستخدم التوجيه البرامج الوسيطة لجهاز التوجيه لتمرير أكثر من وظيفة رد الاتصال (أو صفيف) في أساليبها. هذه الميزة مفيدة للغاية لتقييد الوصول وتنزيل البيانات من خلال التوجيه وما إلى ذلك.
عادة ما يبدو استرجاع البيانات غير المتزامن مثل المثال التالي ، نستخدم معلمة: معرف ونحاول تحميل المستخدم:
نسخة الكود كما يلي:
app.get ('/user/: id' ، function (req ، res ، next) {
loaduser (req.params.id ، وظيفة (err ، المستخدم) {
إذا (err) return next (err) ؛
res.send ('عرض المستخدم' + user.name) ؛
}) ؛
}) ؛
لضمان المبادئ الجافة وتحسين قابلية القراءة ، يمكننا تطبيق هذا المنطق على البرامج الوسيطة. كما هو موضح أدناه ، فإن استخلاص هذا المنطق في الوسيطة سيسمح لك بإعادة استخدامه مع ضمان بساطة التوجيه لدينا.
نسخة الكود كما يلي:
وظيفة loaduser (req ، الدقة ، التالي) {
// ستجلب المستخدم الخاص بك من DB
var user = المستخدمين [req.params.id] ؛
إذا (المستخدم) {
req.user = المستخدم ؛
التالي()؛
} آخر {
التالي (خطأ جديد (فشل في تحميل المستخدم " + req.params.id)) ؛
}
}
app.get ('/user/: id' ، loaduser ، function (req ، res) {
Res.Send ('عرض المستخدم' + req.user.name) ؛
}) ؛
يمكن تطبيق التوجيه المتعدد على طبقة أعمق من المنطق بالترتيب ، مثل تقييد الوصول إلى حساب المستخدم. يسمح المثال التالي فقط للمستخدمين الذين اجتازوا المصادقة لتحرير حساباتهم (لها).
نسخة الكود كما يلي:
وظيفة AndRestrictToself (REQ ، الدقة ، التالي) {
req.AuthenticatedUser.id == req.user.id
؟ التالي()
: التالي (خطأ جديد ('غير مصرح به')) ؛
}
app.get ('/user/: id/edit' ، loaduser ، AndRestrictToself ، function (req ، res) {
Res.Send ('erting user' + req.user.name) ؛
}) ؛
تذكر دائمًا أن التوجيه هو مجرد وظيفة بسيطة ، كما هو موضح أدناه ، يمكننا تحديد الوظائف التي تُرجع الوسيطة لإنشاء حل أكثر تعبيراً ومرونة.
نسخة الكود كما يلي:
وظيفة أندريسترو (دور) {
وظيفة الإرجاع (REQ ، الدقة ، التالي) {
req.AuthenticatedUser.role == دور
؟ التالي()
: التالي (خطأ جديد ('غير مصرح به')) ؛
}
}
app.del ('/user/: id' ، loaduser ، AndRestrictto ('admin') ، function (req ، res) {
Res.Send ('usered user' + req.user.name) ؛
}) ؛
يمكن تمرير "مكدس" البرامج الوسيطة الشائعة الاستخدام عبر صفيف (سيتم تطبيقه بشكل متكرر) ، والذي يمكن خلطه ومطابقته بأي درجة.
نسخة الكود كما يلي:
var a = [middleware1 ، middleware2]
، ب = [الوسيطة 3 ، الوسيطة 4]
، الكل = [a ، b] ؛
app.get ('/foo' ، a ، function () {}) ؛
app.get ('/bar' ، a ، function () {}) ؛
app.get ('/' ، a ، middleware3 ، middleware4 ، function () {}) ؛
app.get ('/' ، a ، b ، function () {}) ؛
app.get ('/' ، all ، function () {}) ؛
للحصول على الكود الكامل لهذا المثيل ، يرجى الاطلاع على مستودع مثال الطريق الوسيطة.
قد يكون لدينا عدة مرات "لتخطي" البرامج الوسيطة التوجيه المتبقية والاستمرار في مطابقة الطرق اللاحقة. للقيام بذلك ، نحتاج فقط إلى الاتصال بـ Next () مع سلسلة "الطريق" - التالي ("الطريق"). إذا لم تتطابق أي طرق متبقية مع عنوان URL المطلوب ، فسيقوم Express بإرجاع 404 غير موجود.
11. طريقة HTTP
حتى الآن ، لقد تعرضت لـ App.get () عدة مرات. بالإضافة إلى ذلك ، يوفر Express أيضًا إجراءات HTTP شائعة أخرى ، مثل app.post () ، app.del () ، إلخ.
مثال شائع لاستخدام ما بعد هو تقديم نموذج. بعد ذلك ، نقوم ببساطة بتعيين سمة الطريقة للنموذج للنشر في HTML ، وسيتم تعيين التحكم في المسار المحدد أدناه.
نسخة الكود كما يلي:
<form method = "post" Action = "/">
<input type = "text" name = "user [name]" />
<input type = "text" name = "user [email]" />
<type type = "إرسال" value = "إرسال" />
</form>
افتراضيًا ، لا يعرف Express كيفية التعامل مع محتوى هذا الطلب ، لذلك يجب علينا إضافة برامج BodyParser الوسيطة ، والتي ستواجه محتوى التطبيق/X-WWW-Form-urlencoded وطلبات التطبيق/JSON وتخزين المتغيرات في req.body. يمكننا استخدام هذا الوسيطة مثل المثال التالي:
نسخة الكود كما يلي:
app.use (express.bodyParser ()) ؛
على النحو التالي ، سيتمكن مسارنا من الوصول إلى كائن req.body.user ، وعندما يتم تعريف الاسم والبريد الإلكتروني ، فإنه سيحتوي على هاتين الخصائص (ملاحظة الترجمة: إذا كان المحتوى المرسل بواسطة النموذج غير فارغ).
نسخة الكود كما يلي:
app.post ('/' ، function (req ، res) {
console.log (req.body.user) ؛
Res.Rredirect ('back') ؛
}) ؛
عندما تريد استخدام طريقة مثل وضع في نموذج ، يمكننا استخدام إدخال مخفي اسمه _method ، والذي يمكن استخدامه لتعديل طرق HTTP. للقيام بذلك ، نحتاج أولاً إلى الوسيطة الوسيطة ، والتي يجب أن تظهر بعد BodyParser من أجل استخدام قيمة النموذج الموجودة في req.body.
نسخة الكود كما يلي:
app.use (express.bodyParser ()) ؛
app.use (express.methodoverride ()) ؛
لماذا هذه الطرق ليست مملوكة افتراضيًا؟ ببساطة ، إنه لمجرد أنه ليس ضروريًا للوظائف الكاملة المطلوبة بواسطة Express. يعتمد استخدام الأساليب على التطبيق الخاص بك ، وقد لا تحتاج إليها ، ويمكن للعميل استخدام طرق مثل PUT و SELETE ، ويمكنك استخدامها مباشرة لأن MethodOverride يوفر حلًا جيدًا للغاية للنموذج. فيما يلي مظاهرة لكيفية استخدام PUT ، والتي قد تبدو:
نسخة الكود كما يلي:
<form method = "post" Action = "/">
<type type = "hidden" name = "_ method" value = "put" />
<input type = "text" name = "user [name]" />
<input type = "text" name = "user [email]" />
<type type = "إرسال" value = "إرسال" />
</form>
app.put ('/' ، function () {
console.log (req.body.user) ؛
Res.Rredirect ('back') ؛
}) ؛
12. معالجة الأخطاء
يوفر Express طريقة App.Error () بحيث يتم طرح الاستثناء المستلم في طريق أو تم نقله إلى التالي (ERR). المثال التالي سوف يتعامل مع صفحات مختلفة بناءً على استثناء محدد:
نسخة الكود كما يلي:
وظيفة notfound (msg) {
this.name = 'notfound' ؛
error.call (هذا ، msg) ؛
error.capturestacktrace (هذا ، enduments.callee) ؛
}
notfound.prototype .__ proto__ = error.prototype ؛
app.get ('/404' ، function (req ، res) {
رمي جدد جديد.
}) ؛
app.get ('/500' ، function (req ، res) {
رمي خطأ جديد ("لوحة المفاتيح Cat!") ؛
}) ؛
كما هو موضح أدناه ، يمكننا استدعاء app.error () عدة مرات. هنا نكتشف مثيل Notfound ونعرض صفحة 404 ، أو ننتقل إلى معالج الخطأ التالي. تجدر الإشارة إلى أنه يمكن تعريف هذه المعالجات في أي مكان ، لأنه سيتم وضعها تحت معالج التوجيه عند الاستماع (). يتيح تعريفات داخل كتلة التكوين () حتى نتمكن من استخدام طرق معالجة الاستثناءات المختلفة بناءً على البيئة.
نسخة الكود كما يلي:
app.error (وظيفة (err ، req ، الدقة ، التالي) {
if (err estrueof notfound) {
Res.Render ('404.jade') ؛
} آخر {
التالي (err) ؛
}
}) ؛
من أجل البساطة ، نحن هنا نفترض أن جميع أخطاء هذا العرض التوضيحي هي 500 ، وبالطبع يمكنك اختيار ما تريد. عند تنفيذ مكالمات النظام إلى نظام ملفات مثل Node ، قد تتلقى خطأً. ترميز مع Enoent ، وهذا يعني "لا يوجد مثل هذا الملف أو الدليل" ، والذي يمكننا استخدامه في معالج الأخطاء ، أو عرض صفحة محددة عند الحاجة.
نسخة الكود كما يلي:
app.error (وظيفة (err ، req ، الدقة) {
Res.Render ('500.Jade' ، {
خطأ: err
}) ؛
}) ؛
يمكن للتطبيق الخاص بنا أيضًا استخدام برنامج Connect's ErrorHandler الوسيط للإبلاغ عن الاستثناءات. على سبيل المثال ، عندما نريد إخراج استثناء Stderr في بيئة "التطوير" ، يمكننا استخدام:
نسخة الكود كما يلي:
app.use (express.errorHandler ({dumpexceptions: true})) ؛
في الوقت نفسه ، خلال مرحلة التطوير ، قد نحتاج إلى عرض الاستثناءات التي نمررها ونلقيها في صفحة HTML الفاخرة ، والتي يمكننا تعيين Showstack لها.
نسخة الكود كما يلي:
app.use (express.errorHandler ({showstack: true ، dumpexceptions: true})) ؛
يمكن لـ ErrorHandler Middleware أيضًا إرجاع JSON عند قبول: Application/JSON موجود ، وهو أمر مفيد للغاية لتطوير التطبيقات التي تعتمد بشكل كبير على JavaScript العميل.
13. المعلمة المعلمة مسبق
يمكن للمعالجة المسبقة للمعلمة التوجيه ، من خلال تحميل البيانات الضمنية والتحقق من الطلب ، تحسين قابلية قراءة البرنامج الخاص بك بشكل كبير. على سبيل المثال ، عادة ما تحتاج إلى الحصول على البيانات الأساسية بشكل مستمر من طرق متعددة. على سبيل المثال ، تحميل مستخدم باستخدام /user /: id ، قد نفعل ذلك:
نسخة الكود كما يلي:
app.get ('/user/: userid' ، function (req ، res ، next) {
user.get (req.params.userid ، function (err ، user) {
إذا (err) return next (err) ؛
res.send ('user' + user.name) ؛
}) ؛
}) ؛
من خلال المعالجة المسبقة ، يمكن تعيين معلماتنا إلى عمليات الاسترجاعات التي تؤدي التحقق من الصحة والتحكم وحتى تحميل البيانات من قاعدة البيانات. على النحو التالي ، ندعو app.param () بأسماء المعلمات ونأمل في تعيينه لبعض البرامج الوسيطة. كما ترون ، نقبل معلمة المعرف التي تمثل قيمة العنصر النائب. باستخدام هذا ، نقوم بتحميل المستخدم كالمعتاد والتعامل مع الخطأ ، وبعيد الاتصال بـ Next () لتسليم التحكم إلى المعالج المسبق التالي أو معالج التوجيه.
نسخة الكود كما يلي:
app.param ('userId' ، function (req ، res ، next ، id) {
user.get (id ، function (err ، user) {
إذا (err) return next (err) ؛
إذا كان (! المستخدم) إرجاع التالي (خطأ جديد (فشل في العثور على المستخدم ")) ؛
req.user = المستخدم ؛
التالي()؛
}) ؛
}) ؛
بمجرد الانتهاء من ذلك ، سيحسن ما سبق بشكل كبير من قابلية قراءة المسار ويسمح لنا بمشاركة المنطق بسهولة في جميع أنحاء البرنامج:
نسخة الكود كما يلي:
app.get ('/user/: userid' ، function (req ، res) {
Res.Send ('user' + req.user.name) ؛
}) ؛
14. عرض المعالجة
يستخدم ملف العرض التنسيق <name>. على سبيل المثال ، سيخبر Skyout.ejs نظام العرض بأنه يتطلب ("EJS") ، ويجب أن تكون الوحدة النمطية المحملة (تصدير) طريقة التصدير. يمكن استخدام app.register () لتغيير هذا السلوك الافتراضي لتعيين ملحقات الملف إلى محركات محددة. على سبيل المثال ، يمكن معالجة "foo.html" بواسطة EJS.
يستخدم المثال التالي Jade لمعالجة index.html. نظرًا لأننا لا نستخدم التصميم: خطأ ، سيتم تمرير المحتوى الذي تتم معالجته بواسطة index.jade إلى متغير محلي يسمى body in layout.jade.
نسخة الكود كما يلي:
app.get ('/' ، function (req ، res) {
Res.Render ('index.jade' ، {title: 'my spical'}) ؛
}) ؛
يتيح لنا إعداد محرك العرض الجديد تحديد محرك القالب الافتراضي ، على سبيل المثال ، عندما نستخدم Jade ، يمكنك تعيينه على هذا النحو:
نسخة الكود كما يلي:
App.set ('View Engine' ، 'Jade') ؛
اسمح لنا بالتعامل مع هذا:
نسخة الكود كما يلي:
Res.Render ('index') ؛
يتوافق مع:
نسخة الكود كما يلي:
Res.Render ('index.jade') ؛
عند تعيين محرك العرض ، يكون الامتداد اختياريًا ، ولكن لا يزال بإمكاننا مزج محرك قالب المطابقة:
نسخة الكود كما يلي:
Res.Render ('page.ejs') ؛
يوفر Express أيضًا إعدادات خيارات العرض ، والتي سيتم تطبيقها على طريقة عرض في كل مرة يتم فيها تقديمها ، على سبيل المثال ، إذا كنت لا ترغب في استخدام التخطيطات:
نسخة الكود كما يلي:
app.set ('View Options' ، {
التصميم: خطأ
}) ؛
يمكن أن يتم تحميل هذا داخل المكالمة Res.Render () عند الحاجة:
نسخة الكود كما يلي:
res.Render ('myview.ejs' ، {layout: true}) ؛
عندما تكون هناك حاجة لتغيير التصميم ، عادة ما نحتاج إلى تحديد مسار آخر. على سبيل المثال ، عندما نضع محرك عرض على Jade ويتم تسمية الملف ./views/mylayout.jade ، يمكننا ببساطة تمرير المعلمات:
نسخة الكود كما يلي:
Res.Render ('page' ، {layout: 'mylayout'}) ؛
وإلا
نسخة الكود كما يلي:
Res.Render ('page' ، {layout: 'mylayout.jade'}) ؛
يمكن أن تكون أيضًا مسارات مطلقة:
نسخة الكود كما يلي:
res.Render ('page' ، {layout: __dirname + '/../../mylayout.jade'}) ؛
هناك مثال جيد على هذا - تخصيص علامات البدء والإغلاق من EJS:
نسخة الكود كما يلي:
app.set ('View Options' ، {
يفتح: '{{'،
يغلق: '}}'
})
15. عرض الأجزاء
يحتوي نظام عرض Express على دعم مدمج للأجزاء والمجموعات ، وهو ما يعادل استبدال جزء المستند بعرض "صغير". على سبيل المثال ، التقديم مرارًا وتكرارًا في عرض لعرض التعليقات ، يمكننا استخدام مجموعة الأجزاء:
نسخة الكود كما يلي:
Partial ('Comment' ، {Collection: Comments}) ؛
إذا لم تكن هناك حاجة إلى خيارات أخرى أو متغيرات محلية ، فيمكننا حذف الكائن بأكمله ونمره ببساطة إلى صفيف ، وهو ما يعادل ما سبق:
نسخة الكود كما يلي:
جزئي ("تعليق" ، تعليقات) ؛
المستخدمة ، توفر مجموعة المكونات بعض الدعم "السحري" للمتغيرات المحلية مجانًا:
1.Firstincollection صحيح ، عندما يكون الكائن الأول
2. indexincollection في كائن المجموعة
3.LastIncollection صحيح ، عندما يكون الكائن الأخير
4.CollectionLength طول كائن التجميع
نقل (توليد) المتغيرات المحلية له أولوية أعلى. في الوقت نفسه ، تنتقل المتغيرات المحلية إلى وجهة نظر الوالدين أيضًا للأطفال. على سبيل المثال ، عندما نستخدم جزئيًا ("المدونة/المنشور" ، نشر) لتقديم منشور مدونة ، فإنه سيولد متغيرًا محليًا. يوجد مستخدم متغير محلي في العرض الذي يستدعي هذه الوظيفة ، والتي ستكون صالحة أيضًا للمدونة/المنشور. (ملاحظة المترجم: هنا جزء يشبه طريقة تضمين في PHP).
ملاحظة: استخدم مجموعة الأجزاء بعناية ، مما يجعل مجموعة من مجموعات الأجزاء بطول 100 يعادل 100 مشاهدة نحتاج إلى معالجتها. بالنسبة للمجموعات البسيطة ، من الأفضل تكرار المدمج بدلاً من استخدام جامع مكون لتجنب النفقات العامة المفرطة.
16. عرض البحث
يتم تنفيذ عملية البحث بالنسبة للعرض بالنسبة لعرض الوالدين (المسار). إذا كان لدينا صفحة عرض تسمى view/user/list.jade ، وجزئي ("تحرير") مكتوب بداخله ، فسيحاول تحميل طرق العرض/user/edit.jade ، وسيقوم جزئي ('..///sfartment ") بتحميل المشاهدات/messages.jade.
يدعم نظام العرض أيضًا فهرسة القالب ، مما يتيح لك استخدام دليل بنفس الاسم مثل العرض. على سبيل المثال ، في المسار ، يحصل Res.Render ('المستخدمون') على عدم وجهات العرض/المستخدمين. (ملاحظة المترجم: تعامل أولاً مع حالة <That>.
عند استخدام فهرس العرض أعلاه ، نستخدم جزئيًا ('المستخدمون) للإشارة إلى طرق العرض/المستخدمين/index.jade في نفس الدليل مثل العرض. في الوقت نفسه ، سيحاول نظام العرض الفهرس ..//الفهرس دون الاتصال الجزئي ('المستخدمين').
17. المحركات قالب
فيما يلي أكثر محركات النماذج استخدامًا لـ Express:
1.haml: تنفيذ هامل
2.Jade: خلف Haml.JS
3.ejs: JavaScript المدمجة
4.Coffeekup: قالب قائم على Coffescript
5. قوالب jquery
18. دعم الجلسة
يمكن الحصول على دعم الجلسة باستخدام البرامج الوسيطة للجلسة في Connect. لهذا السبب ، عادة ما نحتاج إلى إعداده باستخدام برنامج CookieParser الوسيط ، والذي سيقوم بتحليل وتخزين بيانات ملفات تعريف الارتباط في req.cookies.
نسخة الكود كما يلي:
app.use (express.cookieparser ()) ؛
app.use (express.session ({secret: "Keyboard Cat"})) ؛
بشكل افتراضي ، يستخدم Session Middleware تخزين الذاكرة المدمج في Connect ، ولكن هناك العديد من التطبيقات الأخرى. على سبيل المثال ، يوفر Connect-Redis تخزينًا للجلسة Redis ، والذي يمكن استخدامه مثل ما يلي:
نسخة الكود كما يلي:
var redisStore = require ('connect-redis') (express) ؛
app.use (express.cookieparser ()) ؛
app.use (express.session ({secret: "Keyboard Cat" ، Store: New RedisStore})) ؛
في هذه المرحلة ، سيتم استخدام خصائص req.session و req.sessionstore بواسطة جميع الطرق والبرامج الوسيطة اللاحقة. سيتم حفظ جميع الخصائص على req.session تلقائيًا في استجابة ، على سبيل المثال عندما نريد إضافة بيانات إلى عربة التسوق:
نسخة الكود كما يلي:
var redisStore = require ('connect-redis') (express) ؛
app.use (express.bodyParser ()) ؛
app.use (express.cookieparser ()) ؛
app.use (express.session ({secret: "Keyboard Cat" ، Store: New RedisStore})) ؛
app.post ('/add to-cart' ، function (req ، res) {
// قد ننشر عناصر متعددة من خلال نموذج واحد
// (في بعض الحالات ، يتم استخدام الوسيطة bodyparser ())
VAR العناصر = req.body.items ؛
req.session.items = العناصر ؛
Res.Rredirect ('back') ؛
}) ؛
app.get ('/add to-cart' ، function (req ، res) {
// عند العودة ، احصل على الصفحة /الإضافة إلى عربة
// يمكننا التحقق من req.session.items && req.session.items.length
// اطبع المطالبة
if (req.session.items && req.session.items.length) {
req.notify ('info' ، "لديك ٪ s عناصر في عربة التسوق الخاصة بك ، req.session.items.length) ؛
}
Res.Render ('التسوق') ؛
}) ؛
بالنسبة إلى req.session ، فإنه يحتوي أيضًا على طرق مثل الجلسة#touch () ، الجلسة#DRIDER () ، الجلسة#Regenerate () ، وما إلى ذلك للحفاظ على الجلسات وتشغيلها. لمزيد من التفاصيل ، يرجى الرجوع إلى وثائق جلسة الاتصال.
19. دليل الترقية
للطلاب الذين يستخدمون Express 1.x ، إذا كان لديك برامج مهمة تحتاج إلى ترقية إلى 2.x للحصول على دعم أفضل ، فيرجى الاطلاع على دليل الترحيل المفصل للغاية: http://expressjs.com