Co robi „./bin/www” w Express 4.x?


157

Właśnie zacząłem uczyć się o Express 4.0 w mojej aplikacji Node.js i odkryłem, że wygenerował ./bin/wwwplik, w którym zapisywane są tylko serwer aplikacji i ustawienia portu, a wszystko inne, takie jak oprogramowanie pośredniczące i routing, jest zdefiniowane w ./app.jspliku.

Jednak nie jestem pewien, co to ./bin/wwwrobi. Użyłem Express 3.xi zawsze definiowałem ustawienia serwera i portu, a także routing i oprogramowanie pośredniczące w tym samym ./app.jspliku, i uruchamiałem moją aplikację węzła z node app.js. Więc jaki jest sens używania ./bin/www? Czy tylko oddziela serwer i definicję portu od innych?

W tej chwili, kiedy tworzę pakiet przy użyciu generatora ekspresowego, package.jsonzawiera następującą definicję:

"scripts": {
    "start": "node ./bin/www"
}

Zastanawiam się jednak, czy powinienem uruchamiać moją aplikację przy użyciu node ./bin/www, czy npm start. Które polecenie należy uruchomić, aby uruchomić aplikację?

A także, kiedy wdrażam moją aplikację w heroku, co powinienem zapisać w Procfilepliku? Czy web: node app.jswystarczy?


1
Zobacz najlepsze wyjaśnienie na stackoverflow.com/a/36638353/984471
Manohar Reddy Poreddy

Odpowiedzi:


131

W Express 3.0 normalnie używałbyś app.configure()(lub app.use()) do skonfigurowania wymaganego oprogramowania pośredniego. Te określone przez Ciebie oprogramowanie pośredniczące jest dostarczane w pakiecie z Express 3.0.

Przykład:

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.compress());
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());

Jednak w Express 4.0 całe oprogramowanie pośrednie zostało usunięte, aby można je było konserwować i aktualizować niezależnie od podstawowego Expressu (z wyjątkiem statycznego oprogramowania pośredniego), dlatego należy je wywoływać osobno (co widać w app.js).

bin/Katalog służy jako miejsce, gdzie można zdefiniować różne skrypty startowe . wwwJest przykładem, aby uruchomić aplikację wyraźnej jako serwer sieci Web.

Ostatecznie możesz mieć różne skrypty, takie jak test, stoplub restart, itp. Posiadanie tej struktury pozwala na różne konfiguracje uruchamiania, bez wrzucania wszystkiego do siebie app.js.

Prawidłowy sposób uruchomienia aplikacji Express to:

npm start

Aby wdrożyć aplikację Express 4.x na Heroku , dodaj to do Procfile:

web: npm start

Lub jeśli możesz po prostu użyć skryptu startowego w swoim package.json, heroku użyje go automatycznie, przeczytaj więcej tutaj

"scripts": {
    "start": "node ./bin/www",
}

6
Dzięki. Po Twoim doskonałym wyjaśnieniu dwóch ostatnich akapitów, w końcu zrozumiałem, o co mi chodzi www. Nie jestem jednak pewien, dlaczego tak się nazywa - może pochodzi od nazwy World Wide Web?
Blaszard

1
@ NicolasS.Xu Na repozytorium Github ExpressJS na github.com/visionmedia/express , przewiń w dół do sekcji Szybki start
Andy

4
@Ved, dlaczego jednak „bin”? Kojarzy mi się to z binarnymi plikami wykonywalnymi.
regularmike

2
@regularmike myślę, że może to również oznaczać skrypty `` wykonywalne '' (jak w środowisku linuxa)
Andy

2
@Ved tak, wydaje się, że dawno temu ewoluował, aby oznaczać wszystko, co jest wykonywalne. Powszechne w Pythonie, Perlu i ogólnie w unix / linux.
regularmike

10

Aplikacje węzłowe, takie jak Express 3.x, używają niestandardowych plików startowych app.js , ale jest to niewłaściwy plik do uruchomienia.

package.json ma

   "scripts": {
     "start": "node ./bin/www"
   }

który określa wiersz poleceń uruchamiania. Jest to nietrywialne, ponieważ potencjalnie zawiera pełną linię poleceń, a nie tylko ścieżkę do pliku startowego.


czy możesz mi pomóc odpowiedzieć na to pytanie? Dziękuję Ci!
Nicolas S.Xu

7
Dlaczego nazywa się bin? Nie zawiera plików binarnych. . .
Kinnard Hockenhull

2

jeśli używasz generatora ekspresowego, po prostu spójrz na swój lokalny plik, wewnątrz pliku ./bin ./binznajduje się wwwplik. Więc kiedy uruchomisz node ./bin/www, node.js wykona kod w wwwpliku. Nic fajnego.



1

W systemie Windows użyj tego polecenia:

set DEBUG = myapp: * & npm start Następnie załaduj http: // localhost: 3000 / w przeglądarce, aby uzyskać dostęp do aplikacji.


4
Witamy w SO! Nie sądzę, żeby to naprawdę odpowiadało na aktualne pytanie. Przeczytaj ponownie pytanie, aby w pełni zrozumieć wszystkie pytania zawarte w oryginalnym plakacie.
Jake,

0

Wszystkie powyższe odpowiedzi są dobre. Ale na wypadek, gdybyś chciał użyćnode app.js tylko wersji Express 3. *. Możesz śledzić poniżej:

Ponieważ plik app.js, który został wygenerowany przez generator Express 4, jest teraz modułem Node.js , nie można go już uruchamiać niezależnie jako aplikacji (chyba że zmodyfikujesz kod). Moduł należy załadować do pliku Node.js i uruchomić za pośrednictwem pliku Node.js. W tym przypadku plik Node.js to ./bin/www. Aby uzyskać więcej informacji, odwiedź oficjalną dokumentację .

Ani katalog bin, ani plik www bez rozszerzenia nie są wymagane do tworzenia aplikacji Express lub uruchamiania aplikacji. To tylko sugestie generatora, więc możesz je modyfikować, aby odpowiadały Twoim potrzebom.

Aby pozbyć się katalogu www i zachować „Express 3 way”, usuń wiersz z napisem module.exports = app; na końcu pliku app.js, a następnie wklej w jego miejsce następujący kod:

app.set('port', process.env.PORT || 3000)

app.listen(app.get('port'), () => {
  console.log(`Express server listening on port ${app.get('port')}`);
})

Następnie zmień "start": "node ./bin/www"w pliku package.json . Od tego czasu funkcja ./bin/www została przeniesiona z powrotem do app.js. Teraz zacznij używać "start": "node app.js"do uruchamiania aplikacji ekspresowej.


-1

umieść to w Procfile web: node ./bin/www i sprawdź, czy działa z foreman start. Aplikacja powinna być dostępna na porcie 5000

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.