hanya ambil perhatian bahawa banyak telah diubah sejak Express 3. Tutorial ini tidak menjelaskan bagaimana untuk menaik taraf aplikasi anda dari Express 3 untuk menyatakan 4. Sebaliknya ia akan meliputi cara membuat API dengan Express 4 secara langsung. Jadi, mari kita mulakan.
Takeaways Key
Sebelum pergi lebih jauh mari kita lihat apa yang akan kelihatan seperti API:
Struktur direktori
Berikut adalah beberapa perkara mengenai struktur direktori di atas:
tong bin/www.js digunakan untuk bootstrap aplikasi kami.
untuk membuat API kami akan menggunakan modul berikut:
Express
Untuk mendapatkan pakej ini, kami akan menyenaraikannya sebagai kebergantungan dalam pakej.json kami. Inilah fail pakej.json kami:
<span>{ </span> <span>"name": "Movie CRUD API", </span> <span>"version": "0.0.1", </span> <span>"private": true, </span> <span>"scripts": { </span> <span>"start": "node ./bin/www" </span> <span>}, </span> <span>"main":"./bin/www", </span> <span>"engines": { </span> <span>"node": "0.10.x" </span> <span>}, </span> <span>"dependencies": { </span> <span>"express": "~4.2.0", </span> <span>"body-parser": "~1.0.0", </span> <span>"mongoose": "~3.8.11" </span> <span>} </span><span>}</span>
hanya jalankan NPM Pasang dan semua kebergantungan akan dimuat turun dan diletakkan di bawah direktori Node_modules.
Oleh kerana kita sedang membina API untuk pangkalan data filem kita akan membuat model filem. Buat fail bernama Movie.js dan masukkannya dalam direktori Model. Kandungan fail ini, ditunjukkan di bawah, buat model mongoose.
<span>var mongoose=require('mongoose'); </span><span>var Schema=mongoose.<span>Schema</span>; </span> <span>var movieSchema = new Schema({ </span> <span>title: String, </span> <span>releaseYear: String, </span> <span>director: String, </span> <span>genre: String </span><span>}); </span> module<span>.exports = mongoose.model('Movie', movieSchema);</span>
Dalam coretan sebelumnya kami membuat model baru, filem. Setiap filem mempunyai empat sifat yang berkaitan dengannya - tajuk, tahun pelepasan, pengarah, dan genre. Akhirnya, kami meletakkan model dalam modul.exports supaya kami dapat mengaksesnya dari luar.
Semua laluan kami pergi ke laluan/filem.js. Untuk memulakan, tambahkan yang berikut ke fail filem.js anda:
<span>var Movie = require('../models/movie'); </span><span>var express = require('express'); </span><span>var router = express.<span>Router</span>();</span>
Express 4 mempunyai kaedah baru yang dipanggil Express.Router () yang memberikan kita contoh penghala baru. Ia boleh digunakan untuk menentukan middlewares dan laluan. Titik menarik mengenai penghala ekspres adalah bahawa ia sama seperti aplikasi mini. Anda boleh menentukan middlewares dan laluan menggunakan penghala ini dan kemudian hanya menggunakannya dalam aplikasi utama anda seperti mana -mana middleware lain dengan memanggil app.use ().
Apabila pengguna menghantar permintaan GET ke /API /filem, kami harus menghantar respons yang mengandungi semua filem. Berikut adalah coretan yang mewujudkan laluan untuk ini.
router<span>.route('/movies').get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span><span>});</span>
Router.Route () Mengembalikan satu contoh laluan yang boleh digunakan untuk mengkonfigurasi satu atau lebih kata kerja HTTP. Di sini, kami ingin menyokong permintaan GET. Jadi, kami panggil mendapatkan () dan lulus panggilan balik yang akan dipanggil apabila permintaan tiba. Di dalam panggilan balik kami mengambil semua filem menggunakan Mongoose dan menghantarnya kembali kepada pelanggan sebagai JSON.
API kami harus membuat filem baru dalam pangkalan data apabila permintaan pos dibuat ke /API /filem. Rentetan JSON mesti dihantar sebagai badan permintaan. Kami akan menggunakan laluan yang sama, /filem, tetapi gunakan kaedah pos () dan bukannya GET ().
inilah kod:
router<span>.route('/movies').post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span><span>});</span>
di sini, kami membuat contoh filem baru dari badan permintaan. Di sinilah badan parser digunakan. Kemudian kami hanya menyimpan filem baru dan menghantar respons yang menunjukkan bahawa operasi itu berjaya.
Perhatikan bahawa kaedah mendapatkan (), pos (), dan lain -lain. Kembalikan contoh laluan yang sama. Oleh itu, anda boleh berantai dua panggilan sebelumnya seperti yang ditunjukkan di bawah.
router<span>.route('/movies') </span> <span>.get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span> <span>}) </span> <span>.post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span> <span>});</span>
Jika pengguna ingin mengemas kini filem, mereka perlu menghantar permintaan Put ke/API/Filem/: ID dengan rentetan JSON sebagai badan permintaan. Kami menggunakan parameter yang dinamakan: ID untuk mengakses filem sedia ada. Seperti yang kita gunakan MongoDB, semua filem kita mempunyai pengenal unik yang dipanggil _ID. Jadi, kita hanya perlu mengambil parameter: id dan gunakannya untuk mencari filem tertentu. Kod untuk melakukan ini ditunjukkan di bawah.
<span>{ </span> <span>"name": "Movie CRUD API", </span> <span>"version": "0.0.1", </span> <span>"private": true, </span> <span>"scripts": { </span> <span>"start": "node ./bin/www" </span> <span>}, </span> <span>"main":"./bin/www", </span> <span>"engines": { </span> <span>"node": "0.10.x" </span> <span>}, </span> <span>"dependencies": { </span> <span>"express": "~4.2.0", </span> <span>"body-parser": "~1.0.0", </span> <span>"mongoose": "~3.8.11" </span> <span>} </span><span>}</span>
di sini, kami membuat laluan /filem baru /: id dan gunakan kaedah yang diletakkan (). Invokasi filem.findone ({_id: req.params.id}) digunakan untuk mencari filem yang ID diluluskan dalam URL. Sebaik sahaja kami mempunyai contoh filem, kami mengemas kini berdasarkan JSON yang diluluskan dalam badan permintaan. Akhirnya, kami menyimpan filem ini dan menghantar respons kepada pelanggan.
Untuk membaca filem tunggal, pengguna perlu menghantar permintaan GET ke laluan/API/filem/: ID. Kami akan menggunakan laluan yang sama seperti di atas, tetapi gunakan GET () kali ini.
<span>var mongoose=require('mongoose'); </span><span>var Schema=mongoose.<span>Schema</span>; </span> <span>var movieSchema = new Schema({ </span> <span>title: String, </span> <span>releaseYear: String, </span> <span>director: String, </span> <span>genre: String </span><span>}); </span> module<span>.exports = mongoose.model('Movie', movieSchema);</span>
selebihnya kod itu cukup mudah. Kami mengambil filem berdasarkan ID yang diluluskan dan menghantarnya kepada pengguna.
Untuk memadam filem, pengguna harus menghantar permintaan padam ke/API/MOVIE/: ID. Sekali lagi, laluannya sama seperti di atas, tetapi kaedahnya berbeza (iaitu padam ()).
<span>var Movie = require('../models/movie'); </span><span>var express = require('express'); </span><span>var router = express.<span>Router</span>();</span>
filem kaedah.remove () memadam filem dari pangkalan data, dan kami menghantar mesej kepada pengguna yang menunjukkan kejayaan.
Sekarang kita semua sudah siap. Tetapi tunggu! Kita perlu meletakkan contoh penghala dalam modul.exports supaya kita boleh menggunakannya dalam aplikasi kita sebagai middlewaree. Jadi, ini adalah baris terakhir dalam filem.js fail:
router<span>.route('/movies').get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span><span>});</span>
Semua konfigurasi kami masuk ke app.js. Kami mulakan dengan memerlukan modul yang diperlukan:
router<span>.route('/movies').post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span><span>});</span>
Langkah seterusnya adalah menyambung ke MongoDB melalui Mongoose:
router<span>.route('/movies') </span> <span>.get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span> <span>}) </span> <span>.post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span> <span>});</span>
Akhirnya, kita mengkonfigurasi middleware:
router<span>.route('/movies/:id').put(function(req<span>,res</span>){ </span> <span>Movie.findOne({ _id: req.params.id }, function(err<span>, movie</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> <span>for (prop in req.body) { </span> movie<span>[prop] = req.body[prop]; </span> <span>} </span> <span>// save the movie </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json({ message: 'Movie updated!' }); </span> <span>}); </span> <span>}); </span><span>});</span>
seperti yang anda lihat saya telah menggunakan penghala seperti mana -mana middleware lain. Saya lulus /API sebagai hujah pertama untuk app.use () supaya middleware laluan dipetakan ke /API. Jadi, pada akhirnya URL API kami menjadi:
Kod berikut dimasukkan ke dalam bin/www.js, yang bootstraps aplikasi kami:
router<span>.route('/movies/:id').get(function(req<span>, res</span>) { </span> <span>Movie.findOne({ _id: req.params.id}, function(err<span>, movie</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movie); </span> <span>}); </span><span>});</span>
dengan menjalankan nod bin/www.js, API anda harus naik!
Sekarang kita telah mencipta API kita harus mengujinya untuk memastikan semuanya berfungsi seperti yang diharapkan. Anda boleh menggunakan Postman, sambungan Chrome, untuk menguji semua titik akhir anda. Berikut adalah beberapa tangkapan skrin yang menunjukkan pos dan mendapatkan permintaan yang diuji di Postman.
Kesimpulan
kod sumber untuk aplikasi tersedia untuk dimuat turun di GitHub.
Bagaimana saya mengendalikan permintaan pos di Express 4? Permintaan pos masuk Express 4, anda boleh menggunakan kaedah app.post (). Kaedah ini berfungsi sama dengan app.get (), tetapi ia digunakan untuk permintaan pos dan bukannya mendapatkan permintaan. Berikut adalah contoh:
Express 4 menyediakan pengendali ralat terbina dalam, yang menjaga sebarang kesilapan yang mungkin berlaku dalam aplikasinya. Jika anda perlu mengendalikan kesilapan tertentu, anda boleh membuat fungsi middleware pengendalian kesilapan anda sendiri. Berikut adalah contoh: Anda boleh menggunakan parameter laluan untuk menangkap nilai dinamik dalam URL. Nilai -nilai ini kemudiannya boleh digunakan oleh pengendali laluan anda. Berikut adalah contoh: Bagaimana saya menggunakan middleware badan-parser di Express 4? Anda boleh mengendalikan 404 ralat dengan menambahkan fungsi middleware pada akhir stack middleware anda. Fungsi ini akan dilaksanakan jika tiada pengendali laluan lain atau fungsi middleware telah mengendalikan permintaan tersebut. Berikut adalah contoh: });
app.use (function (err, req, res, next) { Bagaimana saya menggunakan parameter dalam 4 laluan Express?
app.get ('/users/: userId', function (req, res) {
Dalam contoh ini, apabila permintaan GET dibuat kepada '/pengguna/123', pelayan akan bertindak balas dengan 'ID Pengguna ialah: 123'. Dalam Express 4?
Express 4 menyediakan fungsi middleware terbina dalam, Express.Static (), untuk melayani fail statik. Anda boleh menggunakannya untuk menyampaikan fail dari direktori pada pelayan anda. Berikut adalah contoh: Dalam contoh ini, fail dalam direktori 'awam' boleh diakses terus dari url akar ('/').
Middleware badan-parser digunakan untuk menghuraikan badan permintaan masuk. Ini membolehkan anda mengakses badan permintaan pos melalui Req.body. Berikut adalah contoh:
var bodyParser = memerlukan ('body-parser'); Dalam contoh ini, middleware badan-parser dikonfigurasi untuk menghuraikan badan json dan url yang dikodkan. Saya mengendalikan 404 kesilapan dalam Express 4?
app.use (fungsi (req, res, seterusnya) {
Bagaimana Saya Menggunakan Express Router dalam Express 4?
var router = express.Router ();
router.get ('/', function (req, res) {
app.use ('/router', router);
Dalam contoh ini, apabila permintaan mendapatkan dibuat kepada '/penghala', pelayan akan Balas dengan 'Hello from the Router!'.
Atas ialah kandungan terperinci Membuat API RESTful dengan Express 4. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!