Apabila membangunkan aplikasi Node.js menggunakan Express.js, penstrukturan asas kod anda dengan berkesan adalah penting untuk kebolehselenggaraan, kebolehskalaan dan kemudahan kerjasama. Struktur projek yang teratur membolehkan anda mengurus kerumitan, menjadikannya lebih mudah untuk menavigasi dan memahami kod. Dalam blog ini, kami akan meneroka struktur folder biasa untuk aplikasi Express.js dan menerangkan tujuan setiap direktori dan fail.
Gambaran Keseluruhan Struktur Projek
Berikut ialah struktur folder biasa untuk aplikasi Express.js:
? ├── ? app.js ├── ? bin ├── ? config ├── ? controllers │ ├── ? customer.js │ ├── ? product.js │ └── ... ├── ? middleware │ ├── ? auth.js │ ├── ? logger.js │ └── ... ├── ? models │ ├── ? customer.js │ ├── ? product.js │ └── ... ├── ? routes │ ├── ? api.js │ ├── ? auth.js │ └── ... ├── ? public │ ├── ? css │ ├── ? js │ ├── ? images │ └── ... ├── ? views │ ├── ? index.ejs │ ├── ? product.ejs │ └── ... ├── ? tests │ ├── ? unit │ ├── ? integration │ ├── ? e2e │ └── ... ├── ? utils │ ├── ? validation.js │ ├── ? helpers.js │ └── ... └── ? node_modules
Penjelasan Setiap Direktori dan Fail
app.js
Fail app.js ialah titik masuk permohonan anda. Di sinilah anda memulakan apl Express, menyediakan perisian tengah, menentukan laluan dan memulakan pelayan. Anggap ia sebagai pusat kawalan aplikasi web anda.
const express = require('express'); const app = express(); const config = require('./config'); const routes = require('./routes'); // Middleware setup app.use(express.json()); // Routes setup app.use('/api', routes); // Start server const PORT = config.port || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); module.exports = app;
bin
Direktori bin biasanya mengandungi skrip untuk memulakan pelayan web anda. Skrip ini boleh digunakan untuk menetapkan pembolehubah persekitaran atau mengurus persekitaran yang berbeza (cth., pembangunan, pengeluaran).
Contoh: bin/www
#!/usr/bin/env node const app = require('../app'); const debug = require('debug')('your-app:server'); const http = require('http'); const port = normalizePort(process.env.PORT || '3000'); app.set('port', port); const server = http.createServer(app); server.listen(port); server.on('error', onError); server.on('listening', onListening); function normalizePort(val) { const port = parseInt(val, 10); if (isNaN(port)) return val; if (port >= 0) return port; return false; } function onError(error) { if (error.syscall !== 'listen') throw error; const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } function onListening() { const addr = server.address(); const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }
konfigurasi
Direktori konfigurasi menyimpan fail konfigurasi untuk aplikasi anda, seperti sambungan pangkalan data, tetapan pelayan dan pembolehubah persekitaran.
Contoh: config/index.js
module.exports = { port: process.env.PORT || 3000, db: { host: 'localhost', port: 27017, name: 'mydatabase' } };
pengawal
Pengawal mengandungi logik untuk mengendalikan permintaan masuk dan menjana respons. Setiap fail dalam direktori pengawal biasanya sepadan dengan bahagian aplikasi anda yang berbeza (cth., pelanggan, produk).
Contoh: pengawal/pelanggan.js
const Customer = require('../models/customer'); exports.getAllCustomers = async (req, res) => { try { const customers = await Customer.find(); res.json(customers); } catch (err) { res.status(500).json({ message: err.message }); } };
perisian tengah
Fungsi middleware digunakan untuk memproses permintaan sebelum ia mencapai pengawal. Mereka boleh mengendalikan tugas seperti pengesahan, pengelogan dan permintaan pengesahan.
Contoh: middleware/auth.js
module.exports = (req, res, next) => { const token = req.header('Authorization'); if (!token) return res.status(401).json({ message: 'Access Denied' }); try { const verified = jwt.verify(token, process.env.JWT_SECRET); req.user = verified; next(); } catch (err) { res.status(400).json({ message: 'Invalid Token' }); } };
model
Model mentakrifkan struktur data anda dan mengendalikan interaksi dengan pangkalan data. Setiap fail model biasanya sepadan dengan entiti data yang berbeza (cth., Pelanggan, Produk).
Contoh: models/customer.js
const mongoose = require('mongoose'); const customerSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('Customer', customerSchema);
laluan
Laluan menentukan laluan ke bahagian lain aplikasi anda dan memetakannya kepada pengawal yang sesuai.
Contoh: route/api.js
const express = require('express'); const router = express.Router(); const customerController = require('../controllers/customer'); router.get('/customers', customerController.getAllCustomers); module.exports = router;
awam
Direktori awam mengandungi fail statik seperti CSS, JavaScript dan imej yang disampaikan terus kepada pelanggan.
Contoh: Struktur Direktori
public/ ├── css/ ├── js/ ├── images/
pandangan
Paparan ialah templat yang memaparkan HTML untuk klien. Menggunakan enjin templat seperti EJS, Pug atau Handlebars, anda boleh menjana HTML dinamik.
Contoh: views/index.ejs
<!DOCTYPE html> <html> <head> <title>My App</title> <link rel="stylesheet" href="/css/styles.css"> </head> <body> <h1>Welcome to My App</h1> <div id="content"> <%- content %> </div> </body> </html>
ujian
Direktori ujian mengandungi fail ujian untuk memastikan aplikasi anda berfungsi dengan betul. Ujian selalunya disusun ke dalam ujian unit, ujian penyepaduan dan ujian hujung ke hujung (e2e).
Contoh: Struktur Direktori
tests/ ├── unit/ ├── integration/ ├── e2e/
kegunaan
Fungsi utiliti dan modul pembantu disimpan dalam direktori utils. Fungsi ini melaksanakan tugas biasa seperti pengesahan dan pemformatan yang digunakan sepanjang aplikasi.
Contoh: utils/validation.js
exports.isEmailValid = (email) => { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(String(email).toLowerCase()); };
modul_nod
Direktori node_modules mengandungi semua kebergantungan yang diperlukan oleh projek anda. Direktori ini diuruskan oleh npm (atau benang) dan termasuk pakej yang dipasang daripada pendaftaran npm.
Kesimpulan
Aplikasi Node.js yang tersusun dengan baik menggunakan Express.js meningkatkan kebolehselenggaraan, kebolehskalaan dan kerjasama. Setiap direktori dan fail dalam struktur mempunyai tujuan tertentu, daripada mengendalikan konfigurasi dan menentukan laluan kepada mengurus middleware dan paparan paparan. Dengan menyusun pangkalan kod anda dengan berkesan, anda boleh membina aplikasi yang teguh dan berskala dengan mudah.
Atas ialah kandungan terperinci Cara Menstruktur Kod Bahagian Belakang Anda dalam Node.js (Express.js). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!