Cosa fa "./bin/www" in Express 4.x?


157

Ho appena iniziato a conoscere Express 4.0 nella mia app Node.js e ho scoperto che ha generato ./bin/wwwfile, su cui sono scritte solo le impostazioni del server delle applicazioni e della porta e tutto ciò che altri come middleware e routing sono definiti nel ./app.jsfile.

Tuttavia, non sono sicuro di cosa ./bin/wwwfaccia. Ho usato Express 3.x e ho sempre definito le impostazioni del server e delle porte, nonché il routing e il middleware sullo stesso ./app.jsfile, e ho lanciato la mia app nodo node app.js. Quindi qual è il punto di usare il ./bin/www? Separa solo la definizione del server e della porta dagli altri?

In questo momento, quando creo il pacchetto usando express-generator, package.jsoninclude la seguente definizione:

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

Tuttavia, mi chiedo se dovrei avviare la mia app utilizzando node ./bin/wwwonpm start . Quale comando devo eseguire per avviare la mia app?

Inoltre, quando distribuisco la mia app su heroku, cosa devo scrivere in Procfile file? È web: node app.jsabbastanza?


Risposte:


131

In Express 3.0 , normalmente si utilizza app.configure()(o app.use()) per configurare il middleware richiesto necessario. I middleware specificati vengono raggruppati insieme a Express 3.0.

Esempio:

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 , tuttavia, tutti i middleware sono stati rimossi in modo che possano essere mantenuti e aggiornati indipendentemente dall'Express core (tranne il middleware statico), quindi devono essere chiamati separatamente (cosa vedi in app.js).

La bin/directory funge da posizione in cui è possibile definire i vari script di avvio . Ecco wwwun esempio per avviare l'app express come web server.

In ultima analisi, si potrebbe avere diversi script come test, stopo restart, ecc Avere questa struttura permette di avere diverse configurazioni di avvio, senza stipare tutto inapp.js .

Il modo corretto di avviare l'app Express è:

npm start

Per distribuire un'app Express 4.x su Heroku , aggiungi questo al tuo Procfile:

web: npm start

O se puoi semplicemente usare lo script di avvio nel tuo package.json, heroku lo userà automaticamente, leggi di più qui

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

6
Grazie. Con la tua eccellente spiegazione degli ultimi due paragrafi, ho finalmente capito qual è il punto di utilizzo www. Non sono sicuro del perché il nome sia così, forse, dal nome del World Wide Web?
Blaszard,

1
@ NicolasS.Xu Nel repository Github di ExpressJS github.com/visionmedia/express , scorrere fino alla sezione Avvio rapido
Andy,

4
@Ved perché "bin", però? Lo associo agli eseguibili binari.
regularmike,

2
@regularmike Immagino che potrebbe anche significare script "eseguibili" (come nell'ambiente di Linux)
Andy,

2
@Ved sì, sembra che molto tempo fa si sia evoluto per significare qualsiasi cosa eseguibile. Comune in Python, Perl e unix / linux in generale.
regularmike,

10

Le app di nodi come Express 3.x utilizzano file di avvio non standard app.js, ma è il file sbagliato da eseguire.

package.json ha

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

che indica la riga di comando di avvio. Non è banale perché potenzialmente contiene una riga di comando completa e non solo un percorso del file di avvio.


potete per favore aiutarmi a rispondere a questa domanda? Grazie!
Nicolas S.Xu,

7
Perché si chiama bin? Non contiene file binari. . .
Kinnard Hockenhull,

2

se stai usando express-generator, guarda il tuo file locale ./bin, c'è un wwwfile all'interno di ./bin. Quindi, quando esegui node ./bin/www, node.js eseguirà il codice nel wwwfile. Nulla di bello.


e se si esegue la distribuzione nel servizio app di Azure, è necessario creare web.config e sostituire tutti index.js con bin / www, in modo simile a quel documento gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna

1

Su Windows, usa questo comando:

impostare DEBUG = myapp: * & npm start Quindi caricare http: // localhost: 3000 / nel browser per accedere all'app.


4
Benvenuti in SO! Non penso che questo risponda davvero alla domanda in corso. Rileggi la domanda per comprendere appieno tutto ciò che il poster originale sta chiedendo.
Jake,

0

Tutto quanto sopra ha risposto bene. Ma nel caso in cui si desidera utilizzarenode app.js solo versioni Express 3. *. Puoi seguire qui sotto:

Poiché il file app.js che è stato generato dal generatore Express 4 è ora un modulo Node.js , non può più essere avviato in modo indipendente come app (a meno che non si modifichi il codice). Il modulo deve essere caricato in un file Node.js e avviato tramite il file Node.js. Il file Node.js è ./bin/www in questo caso. Per maggiori informazioni, visita la documentazione ufficiale .

Né la directory bin né il file www senza estensione sono obbligatori per la creazione di un'app Express o l'avvio dell'app. Sono solo suggerimenti proposti dal generatore, quindi sentiti libero di modificarli in base alle tue esigenze.

Per sbarazzarsi della directory www e mantenere le cose in "Express 3 way", eliminare la riga che dice module.exports = app; alla fine del file app.js, quindi incollare il seguente codice al suo posto:

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

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

Successivamente, modifica "start": "node ./bin/www"il file package.json . Da allora, hai spostato la funzionalità di ./bin/www in app.js. Ora inizia a utilizzare "start": "node app.js"per eseguire la tua app express.


-1

mettilo su Procfile web: node ./bin/www e controlla se funziona foreman start. L'app dovrebbe essere disponibile sulla porta 5000

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.