app.use()dimaksudkan untuk mengikat middleware ke aplikasi Anda. Ini pathadalah jalur " mount " atau " awalan " dan membatasi middleware hanya berlaku untuk jalur apa pun yang diminta yang dimulai dengan itu. Ia bahkan dapat digunakan untuk menyematkan aplikasi lain:
// 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'));
// ...
Dengan menetapkan /sebagai jalur " mount ", app.use()akan merespons ke setiap jalur yang dimulai /, yang semuanya dan terlepas dari kata kerja HTTP yang digunakan:
GET /
PUT /foo
POST /foo/bar
- dll.
app.get(), di sisi lain, adalah bagian dari perutean aplikasi Express dan dimaksudkan untuk mencocokkan dan menangani rute tertentu ketika diminta dengan GETkata kerja HTTP:
Dan, perutean yang setara untuk contoh Anda app.use()sebenarnya adalah:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Pembaruan: Berusaha untuk lebih menunjukkan perbedaan. )
Metode perutean, termasuk app.get(), adalah metode praktis yang membantu Anda menyelaraskan respons terhadap permintaan dengan lebih tepat. Mereka juga menambahkan dukungan untuk fitur seperti parameter dan next('route').
Dalam setiap app.get()panggilan app.use(), jadi Anda pasti bisa melakukan semua ini dengan app.use()langsung. Tetapi, melakukan hal itu akan sering membutuhkan (mungkin tidak perlu) menerapkan kembali sejumlah kode boilerplate.
Contoh:
Untuk rute sederhana dan statis:
app.get('/', function (req, res) {
// ...
});
vs.
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
Dengan beberapa penangan untuk rute yang sama:
app.get('/', authorize('ADMIN'), function (req, res) {
// ...
});
vs.
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);
// ...
});
});
Dengan parameter:
app.get('/item/:id', function (req, res) {
let id = req.params.id;
// ...
});
vs.
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;
// ...
});
Catatan: Pelaksanaan Express' fitur ini terkandung dalam nya Router, LayerdanRoute .