Rumah >hujung hadapan web >tutorial js >Menguasai Express.js: A Deep Dive
Express ialah rangka kerja aplikasi pelayan web yang sangat biasa digunakan dalam Node.js. Pada asasnya, rangka kerja ialah struktur kod yang mematuhi peraturan tertentu dan mempunyai dua ciri utama:
Ciri teras rangka kerja Express adalah seperti berikut:
Artikel ini akan menganalisis cara Express melaksanakan pendaftaran middleware, mekanisme seterusnya dan pengendalian laluan dengan melaksanakan kelas LikeExpress yang mudah.
Mari kita terokai fungsi yang disediakannya melalui dua contoh kod Ekspres:
const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });
Berikut ialah kod app.js fail masukan projek Express yang dijana oleh perancah penjana ekspres:
// Handle errors caused by unmatched routes const createError = require('http-errors'); const express = require('express'); const path = require('path'); const indexRouter = require('./routes/index'); const usersRouter = require('./routes/users'); // `app` is an Express instance const app = express(); // View engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // Parse JSON format data in post requests and add the `body` field to the `req` object app.use(express.json()); // Parse the urlencoded format data in post requests and add the `body` field to the `req` object app.use(express.urlencoded({ extended: false })); // Static file handling app.use(express.static(path.join(__dirname, 'public'))); // Register top-level routes app.use('/', indexRouter); app.use('/users', usersRouter); // Catch 404 errors and forward them to the error handler app.use((req, res, next) => { next(createError(404)); }); // Error handling app.use((err, req, res, next) => { // Set local variables to display error messages in the development environment res.locals.message = err.message; // Decide whether to display the full error according to the environment variable. Display in development, hide in production. res.locals.error = req.app.get('env') === 'development'? err : {}; // Render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
Daripada dua segmen kod di atas, kita dapat melihat bahawa aplikasi contoh Express terutamanya mempunyai tiga kaedah teras:
Berdasarkan analisis fungsi kod Express, kami tahu bahawa pelaksanaan Express memberi tumpuan kepada tiga perkara:
Berdasarkan perkara ini, kami akan melaksanakan kelas LikeExpress yang mudah di bawah.
Pertama, jelaskan kaedah utama yang perlu dilaksanakan oleh kelas ini:
Semak penggunaan httpServer Nod asli:
const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });
Oleh itu, struktur asas kelas LikeExpress adalah seperti berikut:
// Handle errors caused by unmatched routes const createError = require('http-errors'); const express = require('express'); const path = require('path'); const indexRouter = require('./routes/index'); const usersRouter = require('./routes/users'); // `app` is an Express instance const app = express(); // View engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // Parse JSON format data in post requests and add the `body` field to the `req` object app.use(express.json()); // Parse the urlencoded format data in post requests and add the `body` field to the `req` object app.use(express.urlencoded({ extended: false })); // Static file handling app.use(express.static(path.join(__dirname, 'public'))); // Register top-level routes app.use('/', indexRouter); app.use('/users', usersRouter); // Catch 404 errors and forward them to the error handler app.use((req, res, next) => { next(createError(404)); }); // Error handling app.use((err, req, res, next) => { // Set local variables to display error messages in the development environment res.locals.message = err.message; // Decide whether to display the full error according to the environment variable. Display in development, hide in production. res.locals.error = req.app.get('env') === 'development'? err : {}; // Render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
Daripada app.use([path,] panggil balik [, callback...]), kita dapat melihat bahawa middleware boleh menjadi pelbagai fungsi atau satu fungsi. Untuk memudahkan pelaksanaan, kami memproses middleware secara seragam sebagai pelbagai fungsi. Dalam kelas LikeExpress, ketiga-tiga kaedah use(), get(), dan post() semuanya boleh melaksanakan pendaftaran middleware. Hanya perisian tengah yang dicetuskan berbeza-beza disebabkan kaedah permintaan yang berbeza. Jadi kami pertimbangkan:
Susun atur perisian tengah perlu diletakkan di kawasan awam untuk akses mudah melalui kaedah dalam kelas. Jadi, kami meletakkan tatasusunan middleware dalam fungsi constructor() constructor.
const http = require("http"); const server = http.createServer((req, res) => { res.end("hello"); }); server.listen(3003, "127.0.0.1", () => { console.log("node service started successfully"); });
Pendaftaran middleware bermaksud menyimpan middleware dalam tatasusunan middleware yang sepadan. Fungsi pendaftaran middleware perlu menghuraikan parameter masuk. Parameter pertama mungkin laluan atau perisian tengah, jadi perlu terlebih dahulu menentukan sama ada ia adalah laluan. Jika ya, keluarkan ia sebagaimana adanya; jika tidak, lalai ialah laluan akar, dan kemudian tukar parameter middleware yang tinggal kepada tatasusunan.
const http = require('http'); class LikeExpress { constructor() {} use() {} get() {} post() {} // httpServer callback function callback() { return (req, res) => { res.json = function (data) { res.setHeader('content-type', 'application/json'); res.end(JSON.stringify(data)); }; }; } listen(...args) { const server = http.createServer(this.callback()); server.listen(...args); } } module.exports = () => { return new LikeExpress(); };
Dengan fungsi pendaftaran middleware am register(), adalah mudah untuk melaksanakan use(), get(), dan post(), cuma simpan middleware dalam tatasusunan yang sepadan.
const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });
Apabila parameter pertama fungsi pendaftaran ialah laluan, fungsi middleware yang sepadan akan dicetuskan hanya apabila laluan permintaan sepadan dengan laluan atau sub-laluannya. Jadi, kita memerlukan fungsi padanan laluan untuk mengekstrak tatasusunan middleware laluan padanan mengikut kaedah permintaan dan laluan permintaan untuk fungsi panggil balik() seterusnya untuk dilaksanakan:
// Handle errors caused by unmatched routes const createError = require('http-errors'); const express = require('express'); const path = require('path'); const indexRouter = require('./routes/index'); const usersRouter = require('./routes/users'); // `app` is an Express instance const app = express(); // View engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // Parse JSON format data in post requests and add the `body` field to the `req` object app.use(express.json()); // Parse the urlencoded format data in post requests and add the `body` field to the `req` object app.use(express.urlencoded({ extended: false })); // Static file handling app.use(express.static(path.join(__dirname, 'public'))); // Register top-level routes app.use('/', indexRouter); app.use('/users', usersRouter); // Catch 404 errors and forward them to the error handler app.use((req, res, next) => { next(createError(404)); }); // Error handling app.use((err, req, res, next) => { // Set local variables to display error messages in the development environment res.locals.message = err.message; // Decide whether to display the full error according to the environment variable. Display in development, hide in production. res.locals.error = req.app.get('env') === 'development'? err : {}; // Render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
Kemudian, dalam fungsi panggil balik panggil balik() httpServer, ekstrak perisian tengah yang perlu dilaksanakan:
const http = require("http"); const server = http.createServer((req, res) => { res.end("hello"); }); server.listen(3003, "127.0.0.1", () => { console.log("node service started successfully"); });
Parameter fungsi middleware Express ialah req, res dan seterusnya, di mana seterusnya ialah fungsi. Hanya dengan memanggilnya fungsi middleware boleh dilaksanakan mengikut turutan, serupa dengan next() dalam ES6 Generator. Dalam pelaksanaan kami, kami perlu menulis fungsi next() dengan keperluan berikut:
const http = require('http'); class LikeExpress { constructor() {} use() {} get() {} post() {} // httpServer callback function callback() { return (req, res) => { res.json = function (data) { res.setHeader('content-type', 'application/json'); res.end(JSON.stringify(data)); }; }; } listen(...args) { const server = http.createServer(this.callback()); server.listen(...args); } } module.exports = () => { return new LikeExpress(); };
constructor() { // List of stored middleware this.routes = { all: [], // General middleware get: [], // Middleware for get requests post: [], // Middleware for post requests }; }
Akhir sekali, izinkan saya memperkenalkan platform yang sangat sesuai untuk menggunakan Express: Leapcell.
Leapcell ialah platform tanpa pelayan dengan ciri-ciri berikut:
Teroka lebih lanjut dalam dokumentasi!
Twitter Leapcell: https://x.com/LeapcellHQ
Atas ialah kandungan terperinci Menguasai Express.js: A Deep Dive. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!