W rzeczywistości autor (TJ Holowaychuck) podaje lepsze approche: vimeo.com/56166857
avetisk
Rozwiązuje problem routingu dla wielu plików, ale funkcje zdefiniowane w app.js nie są dostępne w trasach.
XIMRX
5
Jeśli potrzebujesz niektórych funkcji, po prostu umieść je w innym module / pliku i wymagaj od app.js i tras.js
BFil
2
Zrozumiałem, że wszystko słyszy, ale wymaga („./ tras”) (aplikacji) ten syntex zaskakuje, czy ktoś może mi powiedzieć, co to dokładnie jest, lub jaki jest pożytek z tego, o ile wiem, że jego obiekt aplikacji „app”
Chociaż to starsze pytanie, natknąłem się tutaj, szukając rozwiązania podobnego problemu. Po wypróbowaniu niektórych rozwiązań tutaj postanowiłem pójść w innym kierunku i pomyślałem, że dodam moje rozwiązanie każdemu, kto tu trafi.
W express 4.x można uzyskać instancję obiektu routera i zaimportować inny plik zawierający więcej tras. Możesz to zrobić rekurencyjnie, aby Twoje trasy importowały inne trasy, umożliwiając tworzenie łatwych w utrzymaniu ścieżek URL. Na przykład, jeśli mam już osobny plik trasy dla mojego punktu końcowego „/ testy” i chcę dodać nowy zestaw tras dla „/ testów / automatycznych”, mogę rozdzielić te trasy „/ automatyczne” na inny plik, aby mój plik „/ test” powinien być mały i łatwy w zarządzaniu. Pozwala również logicznie grupować trasy według ścieżki URL, co może być naprawdę wygodne.
Zawartość pliku ./app.js:
var express = require('express'),
app = express();var testRoutes = require('./routes/tests');// Import my test routes into the path '/test'
app.use('/tests', testRoutes);
Zawartość ./routes/tests.js
var express = require('express'),
router = express.Router();var automatedRoutes = require('./testRoutes/automated');
router
// Add a binding to handle '/test'.get('/',function(){// render the /tests view})// Import my automated routes into the path '/tests/automated'// This works because we're already within the '/tests' route so we're simply appending more routes to the '/tests' endpoint.use('/automated', automatedRoutes);
module.exports = router;
Zawartość pliku ./routes/testRoutes/automated.js:
var express = require('express'),
router = express.Router();
router
// Add a binding for '/tests/automated/'.get('/',function(){// render the /tests/automated view})
module.exports = router;
var routes = fs.readdirSync('routes').filter(function(v){return(/.js$/).test(v);});
Wystarczy użyć wyrażenia regularnego do filtrowania poprzez przetestowanie każdego pliku w tablicy. Nie jest rekurencyjny, ale odfiltruje foldery, które nie kończą się na .js
Wiem, że to stare pytanie, ale próbowałem wymyślić coś dla siebie i to jest miejsce, w którym skończyłem, więc chciałem rozwiązać moje podobne problemy na wypadek, gdyby ktoś miał takie same problemy, jak ja ”. mam. Istnieje ładny moduł węzła o nazwie consign, który wykonuje wiele rzeczy z systemu plików, które są tu widoczne dla ciebie (tj. - nie ma readdirSync). Na przykład:
Mam spokojną aplikację API, którą próbuję zbudować i chcę umieścić wszystkie żądania kierowane do „/ api / *” w celu uwierzytelnienia i chcę zapisać wszystkie moje trasy, które idą w interfejsie API, do ich własnego katalogu (nazwijmy to „api”). W głównej części aplikacji:
Wewnątrz katalogu tras mam katalog o nazwie „api” i plik o nazwie api.js. W api.js po prostu mam:
var express = require('express');var router = express.Router();var consign = require('consign');// get all routes inside the api directory and attach them to the api router// all of these routes should be behind authorization
consign({cwd:'routes'}).include('api').into(router);
module.exports = router;
Wszystko działało zgodnie z oczekiwaniami. Mam nadzieję, że to komuś pomoże.
Czy działa to w przypadku udostępniania globalnych funkcji i zmiennych w app.js? A może musiałbyś je „przekazać” wf.fooitd., Ponieważ są one poza zakresem, tak jak w przypadku innych prezentowanych rozwiązań? Mam na myśli przypadek, w którym normalnie miałbyś dostęp do współużytkowanych zmiennych / funkcji w wf.foo, gdyby nie był oddzielony od app.js.
David
tak, jeśli zadeklarujesz funkcję „foo” w app.js, to app.get ('/ wf', foo); będzie działać
NiallJG
1
Napisałem małą wtyczkę do tego! miałem dość pisania tego samego kodu w kółko.
To prawdopodobnie najbardziej niesamowite pytanie / odpowiedź na pytanie o przepełnienie stosu. Ja kocham rozwiązań Sam / Brada powyżej. Pomyślałem, że włączy się z wersją asynchroniczną, którą zaimplementowałem:
function loadRoutes(folder){if(!folder){
folder = __dirname +'/routes/';}
fs.readdir(folder,function(err, files){var l = files.length;for(var i =0; i < l; i++){var file = files[i];
fs.stat(file,function(err, stat){if(stat && stat.isDirectory()){
loadRoutes(folder +'/'+ file +'/');}else{var dot = file.lastIndexOf('.');if(file.substr(dot +1)==='js'){var name = file.substr(0, dot);// I'm also passing argv here (from optimist)// so that I can easily enable debugging for all// routes.
require(folder + name)(app, argv);}}});}});}
Moja struktura katalogów jest trochę inna. Zazwyczaj definiuję trasy w app.js (w katalogu głównym projektu) przez require-ing './routes'. W związku z tym pomijam czek, index.jsponieważ ja chcę go również uwzględnić.
EDYCJA: Możesz również umieścić to w funkcji i wywołać rekurencyjnie (zredagowałem przykład, aby to pokazać), jeśli chcesz zagnieździć swoje trasy w folderach o dowolnej głębokości.
Dlaczego miałbyś chcieć wersji aysnc? Prawdopodobnie chcesz skonfigurować wszystkie swoje trasy, zanim zaczniesz obsługiwać ruch, albo może skończyć się wysyłaniem „fałszywych” 404.
Joe Abrams,
6
W rzeczy samej. Napisałem to podczas nauki węzła. Z perspektywy czasu zgadzam się, że to nie ma sensu.
tandrewnichols
0
możesz umieścić wszystkie funkcje trasy w innych plikach (modułach) i połączyć je z plikiem głównego serwera. w głównym pliku ekspresowym dodaj funkcję, która połączy moduł z serwerem:
Odpowiedzi:
Jeśli chcesz na przykład umieścić trasy w osobnym pliku ,
routes.js
możesz utworzyćroutes.js
plik w ten sposób:A potem możesz wymagać od obiektu
app.js
przekazania w ten sposób:app
Zobacz także te przykłady
źródło
Chociaż to starsze pytanie, natknąłem się tutaj, szukając rozwiązania podobnego problemu. Po wypróbowaniu niektórych rozwiązań tutaj postanowiłem pójść w innym kierunku i pomyślałem, że dodam moje rozwiązanie każdemu, kto tu trafi.
W express 4.x można uzyskać instancję obiektu routera i zaimportować inny plik zawierający więcej tras. Możesz to zrobić rekurencyjnie, aby Twoje trasy importowały inne trasy, umożliwiając tworzenie łatwych w utrzymaniu ścieżek URL. Na przykład, jeśli mam już osobny plik trasy dla mojego punktu końcowego „/ testy” i chcę dodać nowy zestaw tras dla „/ testów / automatycznych”, mogę rozdzielić te trasy „/ automatyczne” na inny plik, aby mój plik „/ test” powinien być mały i łatwy w zarządzaniu. Pozwala również logicznie grupować trasy według ścieżki URL, co może być naprawdę wygodne.
Zawartość pliku ./app.js:
Zawartość ./routes/tests.js
Zawartość pliku ./routes/testRoutes/automated.js:
źródło
Opierając się na przykładzie @ShadowCloud, byłem w stanie dynamicznie uwzględnić wszystkie trasy w podkatalogu.
trasy / index.js
Następnie umieszczaj pliki tras w katalogu tras w następujący sposób:
trasy / test1.js
Powtarzam to tyle razy, ile potrzebowałem, a potem w końcu umieszczam app.js
źródło
I opierając się jeszcze bardziej na poprzedniej odpowiedzi, ta wersja trasy / index.js zignoruje wszystkie pliki nie kończące się na .js (i sama)
źródło
.DS_Store
pliki i wszystko to psuje.Umieść pełne rekurencyjne routing wszystkich
.js
plików w/routes
folderzeapp.js
.w
/routes
umieścićwhatevername.js
i zainicjować swoje trasy jak to:źródło
Próbuję zaktualizować tę odpowiedź za pomocą „express”: „^ 4.16.3”. Ta odpowiedź jest podobna do ShortRound1911.
server.js
/src/routes/index.js
/src/routes/siswa_route.js
Mam nadzieję, że to może komuś pomóc. Miłego kodowania!
źródło
Jeśli używasz express-4.x z TypeScript i ES6, byłby to najlepszy szablon do użycia:
src/api/login.ts
src/app.ts
Znacznie czystszy niż przy użyciu
var
imodule.exports
.źródło
Jedna poprawka do wszystkich tych odpowiedzi:
Wystarczy użyć wyrażenia regularnego do filtrowania poprzez przetestowanie każdego pliku w tablicy. Nie jest rekurencyjny, ale odfiltruje foldery, które nie kończą się na .js
źródło
Wiem, że to stare pytanie, ale próbowałem wymyślić coś dla siebie i to jest miejsce, w którym skończyłem, więc chciałem rozwiązać moje podobne problemy na wypadek, gdyby ktoś miał takie same problemy, jak ja ”. mam. Istnieje ładny moduł węzła o nazwie consign, który wykonuje wiele rzeczy z systemu plików, które są tu widoczne dla ciebie (tj. - nie ma readdirSync). Na przykład:
Mam spokojną aplikację API, którą próbuję zbudować i chcę umieścić wszystkie żądania kierowane do „/ api / *” w celu uwierzytelnienia i chcę zapisać wszystkie moje trasy, które idą w interfejsie API, do ich własnego katalogu (nazwijmy to „api”). W głównej części aplikacji:
Wewnątrz katalogu tras mam katalog o nazwie „api” i plik o nazwie api.js. W api.js po prostu mam:
Wszystko działało zgodnie z oczekiwaniami. Mam nadzieję, że to komuś pomoże.
źródło
Jeśli chcesz, aby osobny plik .js lepiej organizował trasy, po prostu utwórz zmienną w
app.js
pliku wskazującą jego lokalizację w systemie plików:następnie,
gdzie
.foo
w twoimwf.js
pliku zadeklarowana jest jakaś funkcja . na przykładźródło
wf.foo
itd., Ponieważ są one poza zakresem, tak jak w przypadku innych prezentowanych rozwiązań? Mam na myśli przypadek, w którym normalnie miałbyś dostęp do współużytkowanych zmiennych / funkcji w wf.foo, gdyby nie był oddzielony od app.js.Napisałem małą wtyczkę do tego! miałem dość pisania tego samego kodu w kółko.
https://www.npmjs.com/package/js-file-req
Mam nadzieję, że to pomoże.
źródło
To prawdopodobnie najbardziej niesamowite pytanie / odpowiedź na pytanie o przepełnienie stosu. Ja kocham rozwiązań Sam / Brada powyżej. Pomyślałem, że włączy się z wersją asynchroniczną, którą zaimplementowałem:
Moja struktura katalogów jest trochę inna. Zazwyczaj definiuję trasy w app.js (w katalogu głównym projektu) przez
require
-ing'./routes'
. W związku z tym pomijam czek,index.js
ponieważ ja chcę go również uwzględnić.EDYCJA: Możesz również umieścić to w funkcji i wywołać rekurencyjnie (zredagowałem przykład, aby to pokazać), jeśli chcesz zagnieździć swoje trasy w folderach o dowolnej głębokości.
źródło
możesz umieścić wszystkie funkcje trasy w innych plikach (modułach) i połączyć je z plikiem głównego serwera. w głównym pliku ekspresowym dodaj funkcję, która połączy moduł z serwerem:
i wywołaj tę funkcję dla każdego modelu trasy:
w plikach modułu (na przykład - plik login.js) zdefiniuj funkcje jak zwykle:
i eksportujemy go za pomocą metody żądania jako klucza, a wartością jest tablica obiektów, każdy ze ścieżką i klawiszami funkcyjnymi.
źródło