Saya ingin membagi rute saya menjadi beberapa file berbeda, di mana satu file berisi semua rute dan file lainnya berisi tindakan yang sesuai. Saat ini saya memiliki solusi untuk mencapai ini, namun saya perlu membuat instance aplikasi global untuk dapat mengaksesnya dalam tindakan. Pengaturan saya saat ini terlihat seperti ini:
app.js:
var express = require('express');
var app = express.createServer();
var routes = require('./routes');
var controllers = require('./controllers');
routes.setup(app, controllers);
app.listen(3000, function() {
console.log('Application is listening on port 3000');
});
routes.js:
exports.setup = function(app, controllers) {
app.get('/', controllers.index);
app.get('/posts', controllers.posts.index);
app.get('/posts/:post', controllers.posts.show);
// etc.
};
controller / index.js:
exports.posts = require('./posts');
exports.index = function(req, res) {
// code
};
controller / posts.js:
exports.index = function(req, res) {
// code
};
exports.show = function(req, res) {
// code
};
Namun, penyiapan ini memiliki masalah besar: Saya memiliki database- dan instance aplikasi yang perlu saya sampaikan ke tindakan (pengontrol / *. Js). Satu-satunya pilihan yang dapat saya pikirkan, adalah membuat kedua variabel global yang sebenarnya bukan solusi. Saya ingin memisahkan rute dari tindakan karena saya memiliki banyak rute dan ingin rute tersebut berada di pusat.
Apa cara terbaik untuk meneruskan variabel ke tindakan tetapi memisahkan tindakan dari rute?
Jawaban:
Gunakan
req.app
,req.app.get('somekey')
Variabel aplikasi yang dibuat dengan memanggil
express()
disetel pada objek permintaan dan respons.Lihat: https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35
sumber
app.set('somekey', {})
di app.jsapp.route('/something').get(app.locals.authorized,function(req,res,next){});
tidak mungkin karena berada di luar ruang lingkup req.Node.js mendukung dependensi melingkar.
Memanfaatkan dependensi melingkar alih-alih memerlukan ('./ routes') (app) membersihkan banyak kode dan membuat setiap modul kurang saling bergantung pada file pemuatannya:
app.js
rute / indeks.js
----- Pembaruan 04/2014 -----
Express 4.0 memperbaiki kasus penggunaan untuk menentukan rute dengan menambahkan metode express.router ()!
dokumentasi - http://expressjs.com/4x/api.html#router
Contoh dari generator baru mereka:
Menulis rute:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Menambahkan / namespacing ke aplikasi: https://github.com /expressjs/generator/blob/master/templates/js/app.js#L24
Masih ada kasus penggunaan untuk mengakses aplikasi dari sumber daya lain, jadi dependensi melingkar masih merupakan solusi yang valid.
sumber
app.js
Anda memerlukan file perutean setelah mengekspor aplikasi.require()
Panggilan melingkar dapat membuat kekacauan nyata, jadi pastikan Anda tahu cara kerjanya !app
SEBELUM aplikasimodule.exports
didefinisikan. Anda harus membuat instanceapp
, menyetelmodule.exports
, lalu meminta file yang mungkin memerlukan.app
Tapi bagaimanapun juga, melakukan dependensi melingkar adalah anti-pola yang telah dipecahkan oleh express - Anda tidak perlu melakukannya lagi.Seperti yang saya katakan di komentar, Anda dapat menggunakan fungsi sebagai module.exports. Fungsi juga merupakan objek, jadi Anda tidak perlu mengubah sintaksis Anda.
app.js
controllers.js
controller / index.js
sumber
controllers
fungsi itu, seperti: jsfiddle.net/mihaifm/yV79KAtau lakukan saja:
di dalam Middleware yang Anda gunakan untuk rute ini. Seperti itu:
sumber
app.use('my-service', serviceInstance)
di router utama danreq.app.get('my-service')
di pengontrol seperti yang disebutkan oleh @FengMisalkan Anda memiliki folder bernama "contollers".
Di app.js Anda, Anda dapat meletakkan kode ini:
... dan ...
di controller forlder Anda, Anda akan memiliki file "ping.js" dengan kode ini:
Dan ini dia ....
sumber
App.js terakhir:
Versi lain: Anda dapat menyesuaikan ini sesuai dengan kebutuhan Anda sendiri, seperti menambahkan permintaan posting
sumber
Untuk database, pisahkan Layanan Akses Data yang akan melakukan semua pekerjaan DB dengan API sederhana dan menghindari status bersama.
Route.setup yang terpisah terlihat seperti overhead. Saya lebih suka menempatkan perutean berbasis konfigurasi. Dan konfigurasikan rute dalam .json atau dengan anotasi.
sumber