1. Instalasi
Salin kode sebagai berikut: $ NPM Instal Express
Atau gunakan Executable Express (1) di mana saja untuk menginstal:
Salin kode sebagai berikut:/# penerjemah Catatan: Metode ini sangat disarankan
$ NPM Instal -G Express
2. Mulailah dengan cepat
Cara tercepat untuk memulai dengan Express adalah dengan menggunakan Executable Express (1) untuk menghasilkan aplikasi, seperti yang ditunjukkan di bawah ini:
Buat aplikasi:
Salinan kode adalah sebagai berikut:
$ NPM Instal -G Express
$ express /tmp /foo && cd /tmp /foo
Instal Paket Ketergantungan:
Salinan kode adalah sebagai berikut:
$ npm instalasi -d
Mulai server:
Salinan kode adalah sebagai berikut:
$ node app.js
3. Buat server
Untuk membuat instance Express.httpserver, cukup panggil metode createServer (). Untuk contoh aplikasi ini, kita dapat mendefinisikan rute berdasarkan tindakan HTTP (kata kerja http), mengambil app.get () sebagai contoh:
Salinan kode adalah sebagai berikut:
var app = membutuhkan ('express'). createServer ();
app.get ('/', function (req, res) {
res.send ('halo dunia');
});
app.listen (3000);
4. Buat server https
Inisialisasi instance Express.httpsServer seperti di atas. Kemudian kami meneruskannya objek konfigurasi, menerima kunci, sertifikat, dan lainnya (properti/metode) yang disebutkan dalam dokumentasi HTTPS.
Salinan kode adalah sebagai berikut:
var app = membutuhkan ('express'). createServer ({key: ...});
V. Konfigurasi
Express mendukung lingkungan apa pun, seperti tahap produk dan tahap pengembangan. Pengembang dapat menggunakan metode configure () untuk mengatur lingkungan yang diperlukan saat ini. Jika panggilan untuk mengonfigurasi () tidak berisi nama lingkungan apa pun, itu akan berjalan pada panggilan balik yang ditentukan di semua lingkungan.
Catatan penerjemah: alias seperti produksi/pengembangan/tahap dapat diambil sendiri, seperti yang ditunjukkan dalam app.configure dalam application.js. Lihat contoh berikut untuk penggunaan aktual.
Contoh berikut hanya dumpExceptions (kesalahan melempar) pada tahap pengembangan dan mengembalikan pengecualian tumpukan. Namun, di kedua lingkungan kami menggunakan MethodOverride dan Bodyparser. Perhatikan penggunaan app.router, yang dapat (opsional) digunakan untuk memuat rute program. Selain itu, rute juga akan dimuat dengan memanggil app.get (), app.post (), dll. Untuk pertama kalinya.
Salinan kode adalah sebagai berikut:
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: oneeyear}));
app.use (Express.ErrorHandler ());
});
Untuk lingkungan yang sama Anda dapat melewati beberapa string lingkungan:
Salinan kode adalah sebagai berikut:
app.configure ('stage', 'prod', function () {
// config
});
Untuk pengaturan internal apa pun (#), Express menyediakan set (tombol [, val]), aktifkan (tombol) dan nonaktifkan (kunci) metode:
Catatan Penerjemah: Untuk detailnya, silakan merujuk ke: Application.js app.set.
Salinan kode adalah sebagai berikut:
app.configure (function () {
app.set ('view', __dirname + '/views');
app.set ('view');
// => "/absolute/path/to/views"
app.enable ('beberapa fitur');
// setara dengan: app.set ('beberapa fitur', true);
app.disable ('beberapa fitur');
// setara dengan: app.set ('beberapa fitur', false);
app.enabled ('beberapa fitur')
// => false
});
Untuk mengubah lingkungan, kita dapat mengatur variabel lingkungan node_env, seperti:
Salinan kode adalah sebagai berikut:
$ Node_env = node produksi app.js
Ini sangat penting karena sebagian besar mekanisme caching dihidupkan hanya selama fase produk.
6. Pengaturan
Express mendukung pengaturan jalan pintas berikut (di luar kotak):
1.Basepath digunakan untuk jalur dasar aplikasi res.redirect (), yang secara eksplisit menangani aplikasi yang dipasang.
2. View Lihat Direktori Root Default adalah CWD/Views
3. View Mesin Pemrosesan Mesin Tampilan Default (File Lihat) tidak memerlukan penggunaan sufiks
4. View Cache Mengaktifkan Cache View (diaktifkan dalam tahap produk)
5. Charet Changes Encoding, default adalah UTF-8
6. Rute Sensitif Rute Sensitif Kasus
7. Setelah routing strit diaktifkan (di rute) berakhir/tidak akan diabaikan (catatan terjemahan: yaitu, app.get ('/sofish') dan app.get ('/sofish/') akan berbeda) akan berbeda)
8.Json Callback Enable res.send () / res.json () Dukungan JSONP Eksplisit (Dukungan JSONP Transparan)
7. Routing
Express menggunakan tindakan HTTP untuk memberikan serangkaian API perutean yang cepat dan ekspresif. Misalnya, jika Anda ingin berurusan dengan akun dengan jalur /pengguna /12, kami dapat menentukan rute sebagai berikut. Nilai yang terkait dengan placeholder bernama dapat diakses oleh req.params.
Salinan kode adalah sebagai berikut:
app.get ('/user/: id', function (req, res) {
res.send ('user' + req.params.id);
});
Rute adalah string yang dikompilasi secara internal menjadi biasa. Misalnya, ketika /pengguna /: ID dikompilasi, versi yang disederhanakan dari ekspresi reguler kira -kira sebagai berikut:
Salinan kode adalah sebagai berikut:
// Ubah string resmi
/// user // ([^//]+) //?/
Ekspresi reguler dapat diteruskan dan diterapkan pada skenario yang kompleks. Karena kelompok konten yang ditangkap oleh ekspresi reguler literal adalah anonim, kami dapat mengaksesnya secara langsung melalui req.params. Oleh karena itu, set konten pertama yang kami tangkap adalah req.params [0], sedangkan set kedua segera diikuti oleh req.params [1].
Salinan kode adalah sebagai berikut:
app.get (/^// pengguna? (?: // (/d+) (?: /./. (/d+))?)?/, function (req, res) {
res.send (req.params);
});
Permintaan keriting untuk rute yang ditentukan di atas:
Salinan kode adalah sebagai berikut:
$ curl http: // dev: 3000/pengguna
[NULL, NULL]
$ curl http: // dev: 3000/pengguna
[NULL, NULL]
$ curl http: // dev: 3000/pengguna/1
["1", null]
$ curl http: // dev: 3000/pengguna/1..15
["1", "15"]
Berikut adalah beberapa contoh rute yang terkait dengan jalur yang mungkin mereka gunakan:
Salinan kode adalah sebagai berikut:
"/pengguna/: id"
/pengguna/12
"/Pengguna/: ID?"
/pengguna/5
/pengguna
"/file/*"
/files/jquery.js
/files/javascripts/jquery.js
"/mengajukan/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/Pengguna/: ID/: Operasi?"
/Pengguna/1
/Pengguna/1/Edit
"/Products.:Format"
/products.json
/products.xml
"/Products.:Format?"
/products.json
/products.xml
/produk
"/user/:id.:Format?"
/pengguna/12
/user/12.json
Misalnya, kami dapat menggunakan POST untuk mengirim data JSON, dan menggunakan BodyParser, middleware yang dapat menguraikan konten permintaan JSON (atau konten lainnya) untuk mengembalikan data, dan menyimpan hasil pengembalian di req.body:
Salinan kode adalah sebagai berikut:
var express = membutuhkan ('ekspres')
, app = express.createServer ();
app.use (express.bodyparser ());
app.post ('/', function (req, res) {
res.send (req.body);
});
app.listen (3000);
Biasanya kita dapat menggunakan placeholder gaya "bodoh" seperti pengguna/: id, tanpa batasan (nama). Namun, misalnya, jika kita ingin membatasi ID pengguna hanya menjadi angka, maka kita dapat menggunakan /pengguna /: ID ([0-9]+), yang hanya akan berlaku jika placeholder berisi setidaknya satu angka (adaptasi, cocok).
8. Kontrol rute yang lewat
Kita dapat mengontrol rute yang diadaptasi berikutnya dengan memanggil parameter ketiga, fungsi berikutnya (). Jika adaptasi tidak ditemukan, kontrol akan diteruskan kembali untuk terhubung, dan middleware akan dipanggil secara berurutan dalam urutan yang ditambahkan dalam penggunaan (). Prinsip ini juga berlaku untuk beberapa rute yang ditentukan untuk jalur yang sama, dan mereka akan dipanggil secara bergantian sampai salah satu dari mereka tidak menelepon selanjutnya () dan memutuskan untuk membuat respons permintaan.
Salinan kode adalah sebagai berikut:
app.get ('/user/: id?', function (req, res, next) {
var id = req.params.id;
if (id) {
// Lakukan sesuatu
} kalau tidak {
Berikutnya();
}
});
app.get ('/users', function (req, res) {
// Lakukan sesuatu yang lain
});
Metode app.all () dapat dengan mudah mentransfer logika yang sama ke semua tindakan HTTP dengan menyebutnya sekali. Selanjutnya kami menggunakannya untuk mengekstrak pengguna dari pseudo-data dan menetapkannya ke req.user.
Salinan kode adalah sebagai berikut:
var express = membutuhkan ('ekspres')
, app = express.createServer ();
var users = [{name: 'tj'}];
app.all ('/user/: id/: op?', function (req, res, next) {
req.user = pengguna [req.params.id];
if (req.user) {
Berikutnya();
} kalau tidak {
selanjutnya (kesalahan baru ('tidak dapat menemukan pengguna' + req.params.id));
}
});
app.get ('/user/: id', function (req, res) {
res.send ('melihat' + 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 ('memperbarui' + req.user.name);
});
app.get ('*', function (req, res) {
res.send (404, 'Apa ???');
});
app.listen (3000);
9. Middleware
Middleware Connect (Properties) yang digunakan biasanya disertai oleh server koneksi reguler yang diteruskan ke Express.createServer (). menyukai:
Salinan kode adalah sebagai berikut:
var express = membutuhkan ('express');
var app = express.createServer (
Express.logger ()
, ekspres.bodyparser ()
);
Selain itu, di dalam blok configure () - istana progresif ini (catatan penerjemah: tertawa ^^, dengan cara yang progresif), kita juga dapat menggunakan penggunaan () dengan mudah untuk menambahkan middleware.
Salinan kode adalah sebagai berikut:
app.use (express.logger ({format: ': metode: url'}));
Biasanya, menggunakan middleware connect yang mungkin Anda gunakan memerlukan ('connect'), seperti ini:
Salinan kode adalah sebagai berikut:
var connect = membutuhkan ('connect');
app.use (connect.logger ());
app.use (connect.bodyparser ());
Ini agak tidak menyenangkan sampai batas tertentu, jadi ungkapkan mengekspor kembali properti middleware ini, meskipun mereka sama:
Salinan kode adalah sebagai berikut:
app.use (express.logger ());
app.use (express.bodyparser ());
Urutan middleware sangat penting. Saat Connect menerima permintaan, middleware pertama yang kami lewati ke CreateServer () atau Use () akan disertai dengan tiga parameter, permintaan, respons, dan fungsi panggilan balik (biasanya berikutnya). Ketika berikutnya () dipanggil, itu akan menjadi middleware kedua, dan seterusnya. Ini patut dicatat karena banyak tiddware bergantung satu sama lain. Misalnya, MethodOverride () meminta metode req.body untuk mendeteksi kelebihan metode HTTP. Di sisi lain, bodyparser () mem -parsing konten yang diminta dan menyimpannya di req.body. Contoh lain adalah penguraian cookie dan dukungan sesi. Pertama -tama kita harus menggunakan () cookieParser () dan kemudian sesi ().
Banyak aplikasi ekspres termasuk garis app.use (app.router), yang mungkin tampak agak aneh. Faktanya, ini hanya fungsi middleware yang berisi semua aturan perutean yang ditentukan dan melakukan pencarian routing berdasarkan permintaan URL yang ada dan metode HTTP. Express memungkinkan Anda untuk memutuskan posisinya, tetapi secara default ditempatkan di bagian bawah. Dengan mengubah lokasi rute, kami dapat mengubah prioritas middleware, misalnya, kami ingin menggunakan laporan kesalahan sebagai middleware terakhir sehingga setiap pengecualian yang diteruskan ke selanjutnya () dapat ditangani melalui itu; Atau kami ingin layanan file statis menjadi prioritas yang lebih rendah untuk memungkinkan rute kami mendengarkan unduhan permintaan file statis tunggal, dll. Ini terlihat seperti ini:
Salinan kode adalah sebagai berikut:
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 (...));
Pertama, kami menambahkan logger (), yang mungkin berisi metode req.end () node, memberikan data tentang waktu respons kami. Konten permintaan akan diuraikan (jika ada data), diikuti oleh resolusi cookie dan dukungan sesi. Pada saat yang sama, req.Session akan ditentukan ketika rute di App.Router dipicu. Pada saat ini, kami tidak menelepon selanjutnya (), jadi middleware statis () tidak akan tahu tentang permintaan ini. Jika rute berikut telah didefinisikan, kita dapat merekam berbagai negara, menolak unduhan, dan mengkonsumsi titik unduhan, dll.
Salinan kode adalah sebagai berikut:
var unduhan = {};
app.use (app.router);
app.use (express.static (__ dirname + '/public'));
app.get ('/*', function (req, res, next) {
var file = req.params [0];
unduh [file] = unduhan [file] || 0;
unduhan [file] ++;
Berikutnya();
});
10. Middare Routing
Routing dapat menggunakan middleware router untuk melewati lebih dari satu fungsi callback (atau array) ke dalam metodenya. Fitur ini sangat bermanfaat untuk membatasi akses, mengunduh data melalui perutean, dan sebagainya.
Biasanya pengambilan data asinkron mungkin terlihat seperti contoh berikut, kami menggunakan parameter: ID dan mencoba memuat pengguna:
Salinan kode adalah sebagai berikut:
app.get ('/user/: id', function (req, res, next) {
loadUser (req.params.id, function (err, user) {
if (err) return next (err);
res.send ('melihat pengguna' + user.name);
});
});
Untuk memastikan prinsip -prinsip kering dan meningkatkan keterbacaan, kami dapat menerapkan logika ini ke middleware. Seperti yang ditunjukkan di bawah ini, mengabstraksi logika ini ke middleware akan memungkinkan Anda untuk menggunakannya kembali sambil memastikan kesederhanaan perutean kami.
Salinan kode adalah sebagai berikut:
function loadUser (req, res, next) {
// Anda akan mengambil pengguna Anda dari DB
var user = pengguna [req.params.id];
if (user) {
req.user = pengguna;
Berikutnya();
} kalau tidak {
Berikutnya (kesalahan baru ('Gagal memuat pengguna' + req.params.id));
}
}
app.get ('/user/: id', loadUser, function (req, res) {
res.send ('melihat pengguna' + req.user.name);
});
Beberapa perutean dapat diterapkan ke lapisan logika yang lebih dalam secara berurutan, seperti membatasi akses ke akun pengguna. Contoh berikut hanya memungkinkan pengguna yang telah lulus otentikasi untuk mengedit akun mereka.
Salinan kode adalah sebagai berikut:
Fungsi AndRestrictToSelf (Req, Res, Next) {
req.authenticateUser.id == req.user.id
? Berikutnya()
: selanjutnya (kesalahan baru ('tidak sah'));
}
app.get ('/user/: id/edit', loadUser, andrestricttoSelf, function (req, res) {
res.send ('pengeditan pengguna' + req.user.name);
});
Selalu ingat bahwa perutean hanyalah fungsi sederhana, seperti yang ditunjukkan di bawah ini, kita dapat mendefinisikan fungsi yang mengembalikan middleware untuk membuat solusi yang lebih ekspresif dan fleksibel.
Salinan kode adalah sebagai berikut:
fungsi andRestrictto (peran) {
return function (req, res, next) {
req.authenticateUser.role == Peran
? Berikutnya()
: selanjutnya (kesalahan baru ('tidak sah'));
}
}
app.del ('/user/: id', loadUser, andRestrictto ('admin'), function (req, res) {
res.send ('User Deleted' + req.user.name);
});
"Stack" middleware yang umum digunakan dapat dilewatkan melalui array (yang akan diterapkan secara rekursif), yang dapat dicampur dan dicocokkan dengan derajat apa pun.
Salinan kode adalah sebagai berikut:
var a = [middleware1, middleware2]
, b = [middleware3, middleware4]
, all = [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 () {});
Untuk kode lengkap dari contoh ini, silakan lihat repositori contoh rute middleware.
Kami mungkin memiliki beberapa kali untuk "melewatkan" middleware perutean yang tersisa dan terus mencocokkan rute berikutnya. Untuk melakukan ini, kita hanya perlu menelepon selanjutnya () dengan string 'rute' - selanjutnya ('rute'). Jika tidak ada rute yang tersisa sesuai dengan URL yang diminta, Express akan mengembalikan 404 tidak ditemukan.
11. Metode HTTP
Sejauh ini, saya telah terkena app.get () beberapa kali. Selain itu, Express juga menyediakan tindakan HTTP umum lainnya, seperti app.post (), app.del (), dll.
Contoh umum penggunaan pos adalah mengirimkan formulir. Selanjutnya, kami cukup mengatur atribut metode formulir untuk memposting di HTML, dan kontrol akan ditugaskan ke rute yang ditentukan di bawah ini.
Salinan kode adalah sebagai berikut:
<Metode form = "POST" ACTION = "/">
<input type = "text" name = "user [name]" />
<input type = "text" name = "user [email]" />
<input type = "kirim" value = "kirim" />
</form>
Secara default, Express tidak tahu cara menangani konten permintaan ini, jadi kita harus menambahkan middleware BodyParser, yang akan menguraikan konten aplikasi/X-WWW-Form-Burlencoded dan Application/JSON Permintaan dan menyimpan variabel dalam req.body. Kita dapat menggunakan middleware ini seperti contoh berikut:
Salinan kode adalah sebagai berikut:
app.use (express.bodyparser ());
Sebagai berikut, rute kami akan memiliki akses ke objek req.body.user, dan ketika nama dan email didefinisikan, itu akan berisi dua properti ini (catatan terjemahan: Jika konten yang dikirim oleh formulir tidak kosong).
Salinan kode adalah sebagai berikut:
app.post ('/', function (req, res) {
console.log (req.body.user);
res.redirect ('back');
});
Ketika Anda ingin menggunakan metode seperti dimasukkan ke dalam formulir, kami dapat menggunakan input tersembunyi bernama _method, yang dapat digunakan untuk memodifikasi metode HTTP. Untuk melakukan ini, pertama -tama kita membutuhkan MethodOverride Middleware, yang harus muncul setelah BodyParser untuk menggunakan nilai formulir yang terkandung dalam req.body -nya.
Salinan kode adalah sebagai berikut:
app.use (express.bodyparser ());
app.use (express.methodoverride ());
Mengapa metode ini tidak dimiliki secara default? Sederhananya, itu hanya karena tidak perlu untuk fungsionalitas lengkap yang dibutuhkan oleh Express. Penggunaan metode tergantung pada aplikasi Anda, Anda mungkin tidak memerlukannya, dan klien masih dapat menggunakan metode seperti put dan hapus, dan Anda dapat menggunakannya secara langsung karena MethodOverride memberikan solusi yang sangat baik untuk formulir. Berikut adalah demonstrasi cara menggunakan put, yang mungkin terlihat seperti:
Salinan kode adalah sebagai berikut:
<Metode form = "POST" ACTION = "/">
<input type = "hidden" name = "_ Method" value = "put" />
<input type = "text" name = "user [name]" />
<input type = "text" name = "user [email]" />
<input type = "kirim" value = "kirim" />
</form>
app.put ('/', function () {
console.log (req.body.user);
res.redirect ('back');
});
12. Penanganan kesalahan
Express menyediakan metode app.error () sehingga pengecualian yang diterima dilemparkan ke dalam rute atau diteruskan ke berikutnya (err). Contoh berikut akan menangani berbagai halaman berdasarkan pengecualian notfound spesifik:
Salinan kode adalah sebagai berikut:
function notfound (msg) {
this.name = 'notfound';
Error.call (ini, msg);
Error.capturestacktrace (this, arguments.callee);
}
Notfound.prototype .__ proto__ = error.prototype;
app.get ('/404', function (req, res) {
Lemparkan Notfound Baru;
});
app.get ('/500', function (req, res) {
Lempar kesalahan baru ('Keyboard Cat!');
});
Seperti dijelaskan di bawah ini, kita dapat menghubungi app.error () beberapa kali. Di sini kami mendeteksi instance notfound dan menampilkan halaman 404, atau meneruskan ke penangan kesalahan berikutnya. Perlu dicatat bahwa prosesor ini dapat didefinisikan di mana saja, karena mereka akan ditempatkan di bawah prosesor perutean saat mendengarkan () didengarkan. Ini memungkinkan definisi dalam blok configure () sehingga kami dapat menggunakan metode penanganan pengecualian yang berbeda berdasarkan lingkungan.
Salinan kode adalah sebagai berikut:
app.error (function (err, req, res, next) {
if (err ERRE NOTFOUND) {
res.render ('404.jade');
} kalau tidak {
Berikutnya (err);
}
});
Untuk kesederhanaan, di sini kami berasumsi bahwa semua kesalahan demo ini adalah 500, dan tentu saja Anda dapat memilih apa yang Anda suka. Saat mengeksekusi panggilan sistem ke sistem file seperti node, Anda dapat menerima kesalahan. Kode dengan enoent, yang berarti "tidak ada file atau direktori seperti itu", yang dapat kami gunakan di penangan kesalahan, atau menampilkan halaman tertentu saat diperlukan.
Salinan kode adalah sebagai berikut:
app.error (function (err, req, res) {
res.render ('500.jade', {
Kesalahan: err
});
});
Aplikasi kami juga dapat menggunakan Middleware Errorhandler Connect untuk melaporkan pengecualian. Misalnya, ketika kita ingin mengeluarkan pengecualian stderr di lingkungan "pengembangan", kita dapat menggunakan:
Salinan kode adalah sebagai berikut:
app.use (express.errorhandler ({dumpExceptions: true}));
Pada saat yang sama, selama tahap pengembangan, kita mungkin perlu menampilkan pengecualian yang kita lewati dan lemparkan ke halaman HTML mewah, di mana kita dapat mengatur showstack ke True.
Salinan kode adalah sebagai berikut:
app.use (express.errorhandler ({showStack: true, dumpExceptions: true}));
Middleware ErrorHandler juga dapat mengembalikan JSON saat menerima: Aplikasi/JSON ada, yang sangat berguna untuk mengembangkan aplikasi yang sangat bergantung pada JavaScript klien.
13. Preprocessing parameter rute
Preprocessing parameter routing, melalui pemuatan data implisit dan verifikasi permintaan, dapat sangat meningkatkan keterbacaan program Anda. Misalnya, Anda biasanya perlu terus mendapatkan data dasar dari beberapa rute. Misalnya, memuat pengguna dengan /pengguna /: id, kami mungkin melakukan ini:
Salinan kode adalah sebagai berikut:
app.get ('/user/: userid', function (req, res, next) {
User.get (req.params.userid, function (err, user) {
if (err) return next (err);
res.send ('user' + user.name);
});
});
Melalui preprocessing, parameter kami dapat dipetakan ke callback yang melakukan validasi, kontrol, dan bahkan memuat data dari database. Sebagai berikut, kami memanggil app.param () dengan nama parameter dan berharap untuk memetakannya ke beberapa middleware. Seperti yang Anda lihat, kami menerima parameter ID yang mewakili nilai placeholder. Dengan menggunakan ini, kami memuat pengguna seperti biasa dan menangani kesalahan, dan cukup hubungi Next () untuk menyerahkan kontrol ke preprocessor atau prosesor perutean berikutnya.
Salinan kode adalah sebagai berikut:
app.param ('userid', function (req, res, next, id) {
User.get (id, function (err, user) {
if (err) return next (err);
if (! user) return next (kesalahan baru ('gagal menemukan pengguna'));
req.user = pengguna;
Berikutnya();
});
});
Setelah ini selesai, hal di atas akan sangat meningkatkan keterbacaan rute dan memungkinkan kami untuk dengan mudah berbagi logika di seluruh program:
Salinan kode adalah sebagai berikut:
app.get ('/user/: userid', function (req, res) {
res.send ('user' + req.user.name);
});
14. Lihat pemrosesan
File View menggunakan format <name>. <sine>, di mana <sine> adalah nama modul yang diperlukan. Misalnya, tata letak.EJS akan memberi tahu sistem tampilan untuk memerlukan ('EJS'), dan modul yang dimuat harus (mengekspor) metode ekspor. Compile (STR, Opsi) dan mengembalikan fungsi untuk beradaptasi dengan Express. app.register () dapat digunakan untuk mengubah perilaku default ini untuk memetakan ekstensi file ke mesin tertentu. Misalnya, "foo.html" dapat diproses oleh EJS.
Contoh berikut menggunakan Jade untuk memproses index.html. Karena kami tidak menggunakan tata letak: false, konten yang diproses oleh index.jade akan diteruskan ke variabel lokal yang disebut body in tata letak.
Salinan kode adalah sebagai berikut:
app.get ('/', function (req, res) {
res.render ('index.jade', {title: 'situs saya'});
});
Pengaturan mesin tampilan baru memungkinkan kami untuk menentukan mesin template default, misalnya, ketika kami menggunakan Jade, Anda dapat mengaturnya seperti ini:
Salinan kode adalah sebagai berikut:
app.set ('view engine', 'Jade');
Izinkan kami menangani ini:
Salinan kode adalah sebagai berikut:
res.render ('index');
Sesuai dengan:
Salinan kode adalah sebagai berikut:
res.render ('index.jade');
Saat melihat mesin diatur, ekstensi opsional, tetapi kami masih dapat mencampur mesin template yang cocok:
Salinan kode adalah sebagai berikut:
res.render ('lain halaman.ejs');
Express juga menyediakan pengaturan opsi tampilan, yang akan diterapkan pada tampilan setiap kali diberikan, misalnya, jika Anda tidak ingin menggunakan tata letak:
Salinan kode adalah sebagai berikut:
app.set ('view options', {
Tata letak: Salah
});
Ini dapat kelebihan beban di dalam panggilan res.render () saat dibutuhkan:
Salinan kode adalah sebagai berikut:
res.render ('myview.ejs', {tata letak: true});
Ketika ada kebutuhan untuk mengubah tata letak, kita biasanya perlu menentukan jalur lain. Misalnya, ketika kami telah mengatur mesin tampilan ke Jade dan file bernama ./views/mylayout.jade, kami dapat dengan mudah melewati parameter:
Salinan kode adalah sebagai berikut:
res.render ('halaman', {tata letak: 'mylayout'});
Kalau tidak (Catatan Penerjemah: Saat Mesin Lihat tidak diatur ke Jade atau mesin lainnya), kita harus menentukan ekstensi:
Salinan kode adalah sebagai berikut:
res.render ('halaman', {tata letak: 'mylayout.jade'});
Mereka juga bisa menjadi jalur mutlak:
Salinan kode adalah sebagai berikut:
res.render ('halaman', {tata letak: __dirname + '/../../mylayout.jade'});
Ada contoh yang baik dari ini - sesuaikan tag awal dan tutup EJS:
Salinan kode adalah sebagai berikut:
app.set ('view options', {
membuka: '{{',
menutup: '}}'
})
15. Lihat bagian
Sistem tampilan Express memiliki dukungan bawaan untuk suku cadang dan koleksi, yang setara dengan mengganti fragmen dokumen dengan tampilan "mini". Contoh, berulang kali dalam tampilan untuk menampilkan komentar, kita dapat menggunakan set bagian:
Salinan kode adalah sebagai berikut:
parsial ('komentar', {collection: komentar});
Jika tidak ada opsi lain atau variabel lokal yang diperlukan, kita dapat menghilangkan seluruh objek dan cukup meneruskannya ke dalam array, yang setara dengan hal di atas:
Salinan kode adalah sebagai berikut:
parsial ('komentar', komentar);
Dalam penggunaan, set komponen memberikan beberapa dukungan "sihir" untuk variabel lokal secara gratis:
1.Firstincollection benar, saat itu adalah objek pertama
2. INDEXInCollection di objek Koleksi
3.Lastincollection benar, saat itu adalah objek terakhir
4.CollectionLength panjang objek pengumpulan
Transfer (menghasilkan) variabel lokal memiliki prioritas yang lebih tinggi. Pada saat yang sama, variabel lokal yang diteruskan ke pandangan orang tua juga cocok untuk anak -anak. Misalnya, ketika kami menggunakan parsial ('Blog/Posting', posting) untuk membuat posting blog, itu akan menghasilkan variabel posting lokal. Ada pengguna variabel lokal dalam tampilan yang memanggil fungsi ini, yang juga akan valid untuk blog/posting. (Catatan penerjemah: di sini parsial lebih seperti metode sertakan dalam php).
CATATAN: Gunakan koleksi bagian dengan hati -hati, membuat array koleksi bagian panjang 100 setara dengan 100 tampilan yang perlu kita proses. Untuk koleksi sederhana, yang terbaik adalah mengulangi built-in daripada menggunakan kolektor komponen untuk menghindari overhead yang berlebihan.
16. Lihat Pencarian
Lihat pencarian dieksekusi relatif terhadap tampilan induk (jalur). Jika kami memiliki halaman tampilan yang disebut tampilan/pengguna/list.jade, dan parsial ('Edit') ditulis di dalamnya, ia akan mencoba memuat tampilan/pengguna/edit.jade, dan parsial ('../ pesan') akan memuat tampilan/pesan.
Sistem tampilan juga mendukung pengindeksan templat, memungkinkan Anda menggunakan direktori dengan nama yang sama dengan tampilan. Misalnya, dalam rute, res.render ('pengguna') memperoleh non-views/users.jade, yaitu, tampilan/pengguna/index.jade. (Catatan Penerjemah: Pertama -tama menangani situasi <path>. <sine>, lalu menangani situasi <path>/<index. <sine>. Untuk detailnya, lihat view.js.)
Saat menggunakan indeks tampilan di atas, kami menggunakan parsial ('pengguna') untuk merujuk ke tampilan/pengguna/indeks.jade di direktori yang sama dengan tampilan. Pada saat yang sama, sistem tampilan akan mencoba mengindeks ../ pengguna/indeks tanpa kami memanggil parsial ('pengguna').
17. Mesin Template
Berikut ini adalah mesin template yang paling umum digunakan untuk ekspres:
1.haml: Implementasi HAML
2. JAGE: HAML.JS SUCTER
3.EJS: JavaScript tertanam
4.Coffeekup: Template berbasis CoffeeScript
5. Template Juli
18. Dukungan Sesi
Dukungan sesi dapat diperoleh dengan menggunakan middleware sesi Connect. Untuk alasan ini, kita biasanya perlu mengawalinya dengan middleware cookieParser, yang akan menguraikan dan menyimpan data cookie di req.cookies.
Salinan kode adalah sebagai berikut:
app.use (express.cookieparser ());
app.use (Express.Session ({Secret: "Keyboard Cat"}));
Secara default, middleware sesi menggunakan penyimpanan memori built-in Connect, tetapi ada banyak implementasi lainnya. Misalnya, Connect-Redis menyediakan penyimpanan sesi Redis, yang dapat digunakan seperti berikut:
Salinan kode adalah sebagai berikut:
var redisstore = membutuhkan ('connect-redis') (ekspres);
app.use (express.cookieparser ());
app.use (Express.Session ({Secret: "Keyboard Cat", Store: New Redisstore}));
Pada titik ini, properti req.Session dan req.SessionStore akan digunakan oleh semua rute dan middleware berikutnya. Semua properti di req.Session akan secara otomatis disimpan dalam respons, misalnya ketika kami ingin menambahkan data ke keranjang belanja:
Salinan kode adalah sebagai berikut:
var redisstore = membutuhkan ('connect-redis') (ekspres);
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) {
// Kami dapat memposting beberapa item melalui satu formulir
// (dalam beberapa kasus, bodyparser () middleware digunakan)
var item = req.body.items;
req.Session.items = item;
res.redirect ('back');
});
app.get ('/add-to-cart', function (req, res) {
// Saat kembali, halaman dapatkan /add-to-cart
// kita dapat memeriksa req.session.items && req.session.items.length
// Cetak prompt
if (req.session.items && req.session.items.length) {
req.notify ('info', 'Anda memiliki item %s di keranjang Anda', req.Session.items.length);
}
res.render ('cart shopping');
});
Untuk req.Session, ia juga memiliki metode seperti sesi#touch (), sesi#hancurkan (), sesi#regenerate (), dll. Untuk mempertahankan dan mengoperasikan sesi. Untuk detail lebih lanjut, silakan merujuk ke Dokumentasi Sesi Connect.
19. Panduan Peningkatan
Untuk siswa yang menggunakan Express 1.x, jika Anda memiliki program penting yang perlu ditingkatkan ke 2.x untuk dukungan yang lebih baik, silakan lihat Panduan Migrasi yang sangat rinci resmi: http://expressj.com/guide.html#migration-guide