Rumah  >  Artikel  >  hujung hadapan web  >  Penjelasan terperinci tentang kemahiran Express routing_javascript

Penjelasan terperinci tentang kemahiran Express routing_javascript

WBOY
WBOYasal
2016-05-16 15:26:281368semak imbas

Penghalaan

Penghalaan merujuk kepada cara mentakrifkan titik akhir (URI) aplikasi dan cara membalas permintaan pelanggan.

Penghalaan terdiri daripada URI, permintaan HTTP (GET, POST, dll.) dan beberapa pemegangnya adalah seperti berikut: app.METHOD(path, [callback...], callback), app ialah ekspres. Contoh objek, METHOD ialah kaedah permintaan HTTP, laluan ialah laluan pada pelayan, dan panggil balik ialah fungsi yang akan dilaksanakan apabila laluan dipadankan.

Berikut ialah contoh penghalaan asas:

var express = require('express');
var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
 res.send('hello world');
});

Kaedah penghalaan

Kaedah penghalaan berasal daripada kaedah permintaan HTTP dan dikaitkan dengan contoh nyata.

Contoh berikut menunjukkan permintaan GET dan POST yang ditakrifkan untuk aplikasi dan laluan:

// GET method route
app.get('/', function (req, res) {
 res.send('GET request to the homepage');
});
// POST method route
app.post('/', function (req, res) {
 res.send('POST request to the homepage');
});

Express mentakrifkan kaedah penghalaan berikut yang sepadan dengan permintaan HTTP: dapatkan, hantar, letak, kepala, padam, pilihan, surih, salin, kunci, mkcol, alih, pembersihan, propfind, proppatch, buka kunci, lapor, mkactivity, daftar keluar , gabungkan, m-cari, maklumkan, langgan, nyahlanggan, tampal, cari dan sambung.

Sesetengah nama kaedah penghalaan bukan nama pembolehubah JavaScript yang sah Dalam kes ini, gunakan notasi kurungan, contohnya: app['m-search']('/', function ...
app.all() ialah kaedah penghalaan khas yang tidak sepadan dengan mana-mana kaedah HTTP Fungsinya adalah untuk memuatkan perisian tengah untuk semua permintaan pada laluan.

Dalam contoh di bawah, pemegang akan dilaksanakan untuk permintaan daripada "/secret" tidak kira sama ada mereka menggunakan GET, POST, PUT, DELETE atau sebarang permintaan HTTP lain yang disokong oleh modul http.

app.all('/secret', function (req, res, next) {
 console.log('Accessing the secret section ...');
 next(); // pass control to the next handler
});

Laluan penghalaan

Laluan penghalaan dan kaedah permintaan bersama-sama mentakrifkan titik akhir permintaan, yang boleh menjadi rentetan, corak rentetan atau ungkapan biasa.

Express menggunakan laluan-ke-regexp untuk memadankan laluan penghalaan Sila rujuk dokumentasi untuk semua kaedah mentakrifkan laluan penghalaan. Penguji Laluan Ekspres ialah alat yang hebat untuk menguji laluan Ekspres asas, tetapi tidak menyokong padanan corak.
Rentetan pertanyaan bukan sebahagian daripada laluan penghalaan.

Contoh laluan penghalaan menggunakan rentetan:

// 匹配根路径的请求
app.get('/', function (req, res) {
 res.send('root');
});
// 匹配 /about 路径的请求
app.get('/about', function (req, res) {
 res.send('about');
});
// 匹配 /random.text 路径的请求
app.get('/random.text', function (req, res) {
 res.send('random.text');
});
使用字符串模式的路由路径示例:
// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
 res.send('ab?cd');
});
// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
 res.send('ab+cd');
});
// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
 res.send('ab*cd');
});
// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

Aksara ?, , * dan () ialah subset ungkapan biasa, - dan tafsiran secara literal dalam laluan berasaskan rentetan.
Contoh laluan penghalaan menggunakan ungkapan biasa:

// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {
 res.send('/a/');
});
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
 res.send('/.*fly$/');
});

Pemegang laluan

Anda boleh menyediakan berbilang fungsi panggil balik untuk pemprosesan permintaan, yang berkelakuan seperti perisian tengah. Satu-satunya perbezaan ialah fungsi panggil balik ini boleh memanggil kaedah seterusnya('laluan') dan melangkau fungsi panggil balik laluan lain. Mekanisme ini boleh digunakan untuk menentukan prasyarat untuk penghalaan, dan jika tidak masuk akal untuk meneruskan pelaksanaan pada laluan sedia ada, kawalan boleh diberikan kepada laluan yang tinggal.

Hendal laluan datang dalam pelbagai bentuk dan boleh menjadi fungsi, susunan fungsi atau gabungan kedua-duanya, seperti yang ditunjukkan di bawah.

Gunakan fungsi panggil balik untuk mengendalikan penghalaan:

app.get('/example/a', function (req, res) {
 res.send('Hello from A!');
});

Gunakan berbilang fungsi panggil balik untuk mengendalikan penghalaan (ingat untuk menentukan objek seterusnya):

app.get('/example/b', function (req, res, next) {
 console.log('response will be sent by the next function ...');
 next();
}, function (req, res) {
 res.send('Hello from B!');
});

Gunakan tatasusunan fungsi panggil balik untuk mengendalikan penghalaan:

var cb0 = function (req, res, next) {
 console.log('CB0');
 next();
}
var cb1 = function (req, res, next) {
 console.log('CB1');
 next();
}
var cb2 = function (req, res) {
 res.send('Hello from C!');
}
app.get('/example/c', [cb0, cb1, cb2]);

Gunakan gabungan fungsi dan tatasusunan fungsi untuk mengendalikan penghalaan:

var cb0 = function (req, res, next) {
 console.log('CB0');
 next();
}
var cb1 = function (req, res, next) {
 console.log('CB1');
 next();
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
 console.log('response will be sent by the next function ...');
 next();
}, function (req, res) {
 res.send('Hello from D!');
});

Kaedah respons

Kaedah objek tindak balas (res) dalam jadual berikut mengembalikan respons kepada klien, menamatkan kitaran permintaan-tindak balas. Jika tiada kaedah dipanggil dalam pemegang laluan, permintaan daripada pelanggan akan digantung.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn