Que fait «./bin/www» dans Express 4.x?

157

Je viens de commencer à en savoir plus sur Express 4.0 dans mon application Node.js, et j'ai trouvé qu'il générait un ./bin/wwwfichier, sur lequel seuls le serveur d'application et les paramètres de port sont écrits et tout ce qui est autre comme le middleware et le routage est défini dans un ./app.jsfichier.

Cependant, je ne suis pas sûr de ce que cela ./bin/wwwfait. J'ai utilisé Express 3.x et j'ai toujours défini les paramètres de serveur et de port ainsi que le routage et le middleware sur le même ./app.jsfichier, et j'ai lancé mon application de nœud avec node app.js. Alors, quel est l'intérêt d'utiliser le ./bin/www? Est-ce que cela sépare uniquement la définition du serveur et du port des autres?

À l'heure actuelle, lorsque je crée le package en utilisant express-generator, le package.jsoninclut la définition suivante:

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

Cependant, je me demande si je dois lancer mon application en utilisant node ./bin/www, ou npm start. Quelle commande dois-je exécuter pour démarrer mon application?

Et aussi, lorsque je déploie mon application sur heroku, que dois-je écrire dans le Procfilefichier? Est web: node app.jsassez?

Blaszard
la source
1
Voir la meilleure explication sur stackoverflow.com/a/36638353/984471
Manohar Reddy Poreddy

Réponses:

131

Dans Express 3.0 , vous utiliseriez normalement app.configure()(ou app.use()) pour configurer le middleware requis dont vous avez besoin. Les intergiciels que vous avez spécifiés sont fournis avec Express 3.0.

Exemple:

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

Dans Express 4.0 cependant, tous les middlewares ont été supprimés afin qu'ils puissent être maintenus et mis à jour indépendamment du noyau Express (à l'exception du middleware statique), ils doivent donc être appelés séparément (ce que vous voyez dans app.js).

Le bin/répertoire sert d'emplacement où vous pouvez définir vos différents scripts de démarrage . Le wwwest un exemple pour démarrer l'application express en tant que serveur Web.

En fin de compte, vous pourriez avoir des scripts comme test, stopou restart, etc. Avoir cette structure vous permet d'avoir différentes configurations de démarrage, sans entasser tout enapp.js .

La bonne façon de démarrer votre application Express est:

npm start

Pour déployer une application Express 4.x sur Heroku , ajoutez ceci à votre Procfile:

web: npm start

Ou si vous pouvez simplement utiliser le script de démarrage dans votre package.json, heroku l'utilisera automatiquement, en savoir plus ici

"scripts": {
    "start": "node ./bin/www",
}
Andy
la source
6
Merci. Avec votre excellente explication sur les deux derniers paragraphes, j'ai enfin compris quel est l'intérêt d'utiliser www. Je ne sais pas pourquoi il est nommé ainsi - peut-être nommé d'après le World Wide Web?
Blaszard
1
@ NicolasS.Xu Sur le repo Github d'ExpressJS github.com/visionmedia/express , faites défiler jusqu'à la section Démarrage rapide
Andy
4
@Ved pourquoi "bin", cependant? J'associe cela aux exécutables binaires.
regularmike
2
@regularmike je suppose, cela pourrait aussi signifier des scripts `` exécutables '' (comme dans l'environnement Linux)
Andy
2
@Ved oui, il y a longtemps, cela a évolué pour signifier tout ce qui est exécutable. Commun en Python, Perl et unix / linux en général.
regularmike
10

Les applications de nœud comme Express 3.x utilisent des fichiers de démarrage non standard app.js, mais ce n'est pas le bon fichier à exécuter.

package.json a

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

qui indique la ligne de commande de démarrage. Ce n'est pas trivial car cela contient potentiellement une ligne de commande complète, et pas seulement un chemin vers le fichier de démarrage.

4dgaurav
la source
pouvez-vous s'il vous plaît m'aider à répondre à cette question? Je vous remercie!
Nicolas S.Xu
7
Pourquoi s'appelle-t-il bin? Il ne contient pas de binaires. . .
Kinnard Hockenhull
2

si vous utilisez express-Generator, regardez simplement votre fichier local ,, ./binil y a un wwwfichier à l'intérieur de ./bin. Ainsi, lorsque vous exécutez node ./bin/www, node.js exécutera le code au niveau du wwwfichier. Rien d'extraordinaire.

Max Ma
la source
et si vous déployez sur le service d'application Azure, vous devez créer web.config et remplacer tous les index.js par bin / www, similaire à ce document gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna
1

Sous Windows, utilisez cette commande:

set DEBUG = myapp: * & npm start Puis chargez http: // localhost: 3000 / dans votre navigateur pour accéder à l'application.

user11059213
la source
4
Bienvenue à SO! Je ne pense pas que cela réponde vraiment à la question actuelle. Veuillez relire la question pour bien comprendre tout ce que l'affiche originale demande.
Jake
0

Tout ce qui précède a bien répondu. Mais au cas où si vous souhaitez utilisernode app.js que les versions Express 3. *. Vous pouvez suivre ci-dessous:

Étant donné que le fichier app.js qui a été généré par le générateur Express 4 est maintenant un module Node.js , il ne peut plus être démarré indépendamment en tant qu'application (sauf si vous modifiez le code). Le module doit être chargé dans un fichier Node.js et démarré via le fichier Node.js. Le fichier Node.js est ./bin/www dans ce cas. Pour plus d'informations, visitez la documentation officielle .

Ni le répertoire bin ni le fichier www sans extension ne sont obligatoires pour créer une application Express ou démarrer l'application. Ce ne sont que des suggestions faites par le générateur, alors n'hésitez pas à les modifier en fonction de vos besoins.

Pour se débarrasser du répertoire www et conserver les choses «Express 3 way», supprimez la ligne qui dit module.exports = app; à la fin du fichier app.js, puis collez le code suivant à sa place:

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

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

Ensuite, modifiez "start": "node ./bin/www"le fichier package.json . Depuis, vous avez déplacé la fonctionnalité de ./bin/www vers app.js. Maintenant, commencez à utiliser "start": "node app.js"pour exécuter votre application express.

Kapil Raghuwanshi
la source
-1

mettez ceci dans Procfile web: node ./bin/www et vérifiez si cela fonctionne avec foreman start. L'application devrait être disponible sur le port 5000

timtch
la source