Was macht "./bin/www" in Express 4.x?

157

Ich habe gerade angefangen, Express 4.0 in meiner Node.js-App kennenzulernen, und festgestellt, dass eine ./bin/wwwDatei generiert wurde , auf der nur die Einstellungen für den Anwendungsserver und den Port geschrieben sind und alles andere wie Middleware und Routing in der ./app.jsDatei definiert ist.

Ich bin mir jedoch nicht sicher, was dies ./bin/wwwbewirkt. Ich habe Express 3.x verwendet und immer Server- und Porteinstellungen sowie Routing und Middleware für die identische ./app.jsDatei definiert und meine Knoten-App mit gestartet node app.js. Was bringt es also, das zu verwenden ./bin/www? Trennt es nur die Server- und Portdefinition von anderen?

Wenn ich das Paket jetzt mit dem Express-Generator erstelle, package.jsonenthält es die folgende Definition:

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

Ich frage mich jedoch, ob ich meine App mit node ./bin/wwwoder starten soll npm start. Welchen Befehl soll ich ausführen, um meine App zu starten?

Und was soll ich in die ProcfileDatei schreiben, wenn ich meine App für Heroku bereitstelle ? Ist web: node app.jsgenug

Blaszard
quelle
1
Siehe beste Erklärung unter stackoverflow.com/a/36638353/984471
Manohar Reddy Poreddy

Antworten:

131

In Express 3.0 verwenden Sie normalerweise app.configure()(oder app.use()), um die erforderliche Middleware einzurichten, die Sie benötigen. Die von Ihnen angegebene Middleware wird zusammen mit Express 3.0 gebündelt.

Beispiel:

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());

In Express 4.0 wurden jedoch alle Middleware-Programme entfernt, damit sie unabhängig vom Core Express (mit Ausnahme der statischen Middleware) gewartet und aktualisiert werden können. Daher müssen sie separat aufgerufen werden (wie in app.js).

Das bin/Verzeichnis dient als Speicherort, an dem Sie Ihre verschiedenen Startskripte definieren können . Dies wwwist ein Beispiel zum Starten der Express-App als Webserver.

Letztendlich könnten Sie verschiedene Skripte wie test, stopoder restartusw. haben. Mit dieser Struktur können Sie verschiedene Startkonfigurationen haben, ohne alles zu stopfen app.js.

Der richtige Weg, um Ihre Express-App zu starten, ist:

npm start

Fügen Sie Folgendes hinzu , um eine Express 4.x- App für Heroku bereitzustellenProcfile :

web: npm start

Oder wenn Sie nur das package.jsonStartskript in Ihrem verwenden können , verwendet Heroku das automatisch. Lesen Sie hier mehr

"scripts": {
    "start": "node ./bin/www",
}
Andy
quelle
6
Vielen Dank. Mit Ihrer hervorragenden Erklärung zu den letzten beiden Absätzen habe ich endlich verstanden, wozu es gut ist www. Ich bin mir nicht sicher, warum es so heißt - vielleicht nach dem World Wide Web benannt?
Blaszard
1
@ NicolasS.Xu Scrollen Sie auf dem Github-Repo github.com/visionmedia/express des ExpressJS zum Abschnitt Schnellstart
Andy,
4
@Ved warum "bin" aber? Ich verbinde das mit binären ausführbaren Dateien.
Regularmike
2
@regularmike Ich denke, es könnte auch "ausführbare" Skripte bedeuten (wie in der Linux-Umgebung)
Andy
2
@Ved ja, es scheint lange her zu sein, dass es sich um etwas ausführbares handelt. Allgemein in Python, Perl und Unix / Linux im Allgemeinen.
Regularmike
10

Knoten-Apps wie Express 3.x verwenden nicht standardmäßige Startdateien app.js, aber es ist die falsche Datei, die ausgeführt werden soll.

package.json hat

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

Hier wird die Startbefehlszeile angegeben. Es ist nicht trivial, da dies möglicherweise eine vollständige Befehlszeile enthält und nicht nur einen Pfad zur Starterdatei.

4dgaurav
quelle
Können Sie mir bitte bei der Beantwortung dieser Frage helfen? Danke dir!
Nicolas S.Xu
6
Warum heißt es bin? Es enthält keine Binärdateien. . .
Kinnard Hockenhull
2

Wenn Sie den Express-Generator verwenden, schauen Sie sich einfach Ihre lokale Datei an. In der ./bin ./binbefindet sich eine wwwDatei. Wenn Sie also ausführen node ./bin/www, führt node.js den Code in der wwwDatei aus. Nichts Besonderes.

Max Ma
quelle
Wenn Sie für den Azure-Appdienst bereitstellen, müssen Sie web.config erstellen und alle index.js durch bin / www ersetzen, ähnlich dem Dokument gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna
1

Verwenden Sie unter Windows diesen Befehl:

setze DEBUG = myapp: * & npm start Dann lade http: // localhost: 3000 / in deinen Browser, um auf die App zuzugreifen.

user11059213
quelle
4
Willkommen bei SO! Ich denke nicht, dass dies die vorliegende Frage wirklich beantwortet. Bitte lesen Sie die Frage erneut, um alle Fragen des Originalplakats vollständig zu verstehen.
Jake
0

Alle oben genannten haben gut geantwortet. Aber für den Fall, dass Sie node app.jsnur wie Express 3. * Versionen verwenden möchten . Sie können unten folgen:

Da die vom Express 4-Generator generierte Datei app.js jetzt ein Node.js-Modul ist , kann sie nicht mehr unabhängig als App gestartet werden (es sei denn, Sie ändern den Code). Das Modul muss in eine Node.js-Datei geladen und über die Node.js-Datei gestartet werden. Die Node.js-Datei lautet in diesem Fall ./bin/www. Weitere Informationen finden Sie in der offiziellen Dokumentation .

Weder das bin-Verzeichnis noch die erweiterungslose www-Datei sind zum Erstellen einer Express-App oder zum Starten der App obligatorisch. Es handelt sich lediglich um Vorschläge des Generators. Sie können sie also jederzeit an Ihre Bedürfnisse anpassen.

Löschen Sie die Zeile mit der Aufschrift module.exports = app; Fügen Sie am Ende der Datei app.js an ihrer Stelle den folgenden Code ein:

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

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

Ändern Sie "start": "node ./bin/www"als Nächstes die Datei package.json . Seitdem haben Sie die Funktionalität von ./bin/www wieder auf app.js verschoben. Beginnen Sie jetzt mit der "start": "node app.js"Ausführung Ihrer Express-App.

Kapil Raghuwanshi
quelle
-1

Legen web: node ./bin/www Sie dies in Procfile und prüfen Sie, ob es funktioniert foreman start. Die App sollte auf Port 5000 verfügbar sein

timtch
quelle