Chcę podzielić moje trasy na różne pliki, z których jeden zawiera wszystkie trasy, a drugi odpowiednie akcje. Obecnie mam rozwiązanie, aby to osiągnąć, jednak muszę ustawić instancję aplikacji jako globalną, aby mieć do niej dostęp w akcjach. Moja obecna konfiguracja wygląda następująco:
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');
});
route.js:
exports.setup = function(app, controllers) {
app.get('/', controllers.index);
app.get('/posts', controllers.posts.index);
app.get('/posts/:post', controllers.posts.show);
// etc.
};
controllers / index.js:
exports.posts = require('./posts');
exports.index = function(req, res) {
// code
};
controllers / posts.js:
exports.index = function(req, res) {
// code
};
exports.show = function(req, res) {
// code
};
Jednak ta konfiguracja ma duży problem: mam bazę danych i instancję aplikacji, które muszę przekazać do akcji (controllers / *. Js). Jedyną opcją, o której mógłbym pomyśleć, jest uczynienie obu zmiennych globalnymi, co nie jest rozwiązaniem. Chcę oddzielić trasy od działań, ponieważ mam dużo tras i chcę, aby były w centralnym miejscu.
Jaki jest najlepszy sposób przekazywania zmiennych do akcji, ale oddzielając działania od tras?
Odpowiedzi:
Użyj
req.app
,req.app.get('somekey')
Zmienna aplikacji utworzona przez wywołanie
express()
jest ustawiana w obiektach żądania i odpowiedzi.Zobacz: https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35
źródło
app.set('somekey', {})
do app.jsapp.route('/something').get(app.locals.authorized,function(req,res,next){});
nie jest to możliwe, ponieważ jest poza zakresem wymagań .Node.js obsługuje zależności cykliczne.
Wykorzystanie zależności cyklicznych zamiast require ('./ tours') (app) czyści wiele kodu i sprawia, że każdy moduł jest mniej zależny od pliku ładującego:
app.js
route / index.js
----- Aktualizacja 04/2014 -----
Express 4.0 naprawił przypadek użycia przy definiowaniu tras poprzez dodanie metody express.router ()!
dokumentacja - http://expressjs.com/4x/api.html#router
Przykład z ich nowego generatora:
Pisanie trasy:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Dodawanie / tworzenie przestrzeni nazw do aplikacji: https://github.com /expressjs/generator/blob/master/templates/js/app.js#L24
Nadal istnieją przypadki uzyskiwania dostępu do aplikacji z innych zasobów, więc zależności cykliczne są nadal prawidłowym rozwiązaniem.
źródło
app.js
że potrzebujesz pliku routingu po wyeksportowaniu aplikacji.require()
Połączenia okólne mogą wywołać prawdziwy bałagan, więc upewnij się, że wiesz, jak one działają !app
PRZEDmodule.exports
zdefiniowaniem aplikacji . Musisz utworzyć instancjęapp
, ustawićmodule.exports
, a następnie wymagać plików, które mogą wymagać.app
Ale tak czy inaczej, wykonywanie zależności cyklicznych jest anty-wzorcem, który został rozwiązany przez express - nie powinieneś już tego robić.Jak powiedziałem w komentarzach, możesz użyć funkcji jako module.exports. Funkcja jest również obiektem, więc nie musisz zmieniać swojej składni.
app.js
controllers.js
controllers / index.js
źródło
controllers
funkcja, coś jak: jsfiddle.net/mihaifm/yV79KLub po prostu zrób to:
wewnątrz oprogramowania pośredniczącego, którego używasz dla tych tras. Tak:
źródło
app.use('my-service', serviceInstance)
w głównym routerze ireq.app.get('my-service')
kontrolerze, o czym wspomniał @FengZałóżmy, że masz folder o nazwie „contollers”.
W swoim app.js możesz umieścić ten kod:
... i ...
w swoich kontrolerach będziesz mieć plik „ping.js” z tym kodem:
I to jest to ....
źródło
Ostateczna wersja app.js:
Inna wersja: możesz dostosować to do własnych potrzeb, na przykład dodać prośbę o wpis
źródło
W przypadku bazy danych wyodrębnij usługę dostępu do danych, która będzie wykonywać całą pracę bazy danych z prostym interfejsem API i unikać stanu wspólnego.
Oddzielanie route.setup wygląda jak narzut. Wolałbym zamiast tego umieścić routing oparty na konfiguracji. I skonfiguruj trasy w .json lub z adnotacjami.
źródło