app.use()
dimaksudkan untuk mengikat middleware ke aplikasi Anda. Ini path
adalah 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 GET
kata 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
, Layer
danRoute
.