app.use()
được thiết kế để ràng buộc phần mềm trung gian với ứng dụng của bạn. Đây path
là đường dẫn " mount " hoặc " prefix " và giới hạn phần mềm trung gian chỉ áp dụng cho bất kỳ đường dẫn nào được yêu cầu bắt đầu với nó. Nó thậm chí có thể được sử dụng để nhúng một ứng dụng khác:
// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();
app.use('/subapp', require('./subapp'));
// ...
Bằng cách chỉ định /
là đường dẫn " gắn kết ", app.use()
sẽ phản hồi bất kỳ đường dẫn nào bắt đầu bằng /
tất cả chúng và bất kể động từ HTTP được sử dụng:
GET /
PUT /foo
POST /foo/bar
- Vân vân.
app.get()
mặt khác, là một phần của định tuyến ứng dụng của Express và được dùng để khớp và xử lý một tuyến cụ thể khi được yêu cầu với GET
động từ HTTP:
Và, định tuyến tương đương cho ví dụ của bạn app.use()
thực sự sẽ là:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Cập nhật: Cố gắng thể hiện tốt hơn sự khác biệt. )
Các phương thức định tuyến, bao gồm app.get()
, là các phương thức tiện lợi giúp bạn căn chỉnh các phản hồi cho các yêu cầu chính xác hơn. Họ cũng thêm hỗ trợ cho các tính năng như tham số và next('route')
.
Trong mỗi app.get()
cuộc gọi là một cuộc gọi đến app.use()
, vì vậy bạn chắc chắn có thể thực hiện tất cả điều này với app.use()
trực tiếp. Nhưng, làm như vậy thường sẽ yêu cầu (có thể không cần thiết) thực hiện lại số lượng mã soạn sẵn khác nhau.
Ví dụ:
Đối với các tuyến đường đơn giản, tĩnh:
app.get('/', function (req, res) {
// ...
});
so với
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
Với nhiều trình xử lý cho cùng một tuyến đường:
app.get('/', authorize('ADMIN'), function (req, res) {
// ...
});
so với
const authorizeAdmin = authorize('ADMIN');
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
authorizeAdmin(req, res, function (err) {
if (err) return next(err);
// ...
});
});
Với các tham số:
app.get('/item/:id', function (req, res) {
let id = req.params.id;
// ...
});
so với
const pathToRegExp = require('path-to-regexp');
function prepareParams(matches, pathKeys, previousParams) {
var params = previousParams || {};
// TODO: support repeating keys...
matches.slice(1).forEach(function (segment, index) {
let { name } = pathKeys[index];
params[name] = segment;
});
return params;
}
const itemIdKeys = [];
const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
app.use('/', function (req, res, next) {
if (req.method !== 'GET') return next();
var urlMatch = itemIdPattern.exec(req.url);
if (!urlMatch) return next();
if (itemIdKeys && itemIdKeys.length)
req.params = prepareParams(urlMatch, itemIdKeys, req.params);
let id = req.params.id;
// ...
});
Lưu ý: việc thực hiện các tính năng Express được chứa trong nó Router
, Layer
vàRoute
.