¿Qué hace "./bin/www" en Express 4.x?


157

Recién comencé a aprender sobre Express 4.0 en mi aplicación Node.js, y descubrí que generaba un ./bin/wwwarchivo, en el que solo se escriben el servidor de aplicaciones y la configuración del puerto y todo lo demás, como middleware y enrutamiento, se define en el ./app.jsarchivo.

Sin embargo, no estoy seguro de lo que esto ./bin/wwwhace. Utilicé Express 3.xy siempre definí la configuración del servidor y del puerto, así como el enrutamiento y el middleware en el mismo ./app.jsarchivo, e inicié mi aplicación de nodo con node app.js. Entonces, ¿cuál es el punto de usar el ./bin/www? ¿Solo separa el servidor y la definición de puerto de los demás?

En este momento, cuando creo el paquete usando express-generator, package.jsonincluye la siguiente definición:

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

Sin embargo, me pregunto si debería iniciar mi aplicación usando node ./bin/www, o npm start. ¿Qué comando debo ejecutar para iniciar mi aplicación?

Y también, cuando implemente mi aplicación en heroku, ¿qué debo escribir en el Procfilearchivo? Es web: node app.jssuficiente?


Respuestas:


131

En Express 3.0 , normalmente usaría app.configure()(o app.use()) para configurar el middleware requerido que necesita. Los middleware que especificó se incluyen junto con Express 3.0.

Ejemplo:

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

Sin embargo, en Express 4.0 , todos los middleware se han eliminado para que puedan mantenerse y actualizarse independientemente del Express central (excepto el middleware estático), por lo que deben llamarse por separado (lo que ve en app.js).

El bin/directorio sirve como una ubicación donde puede definir sus diversos scripts de inicio . Este wwwes un ejemplo para iniciar la aplicación express como servidor web.

En última instancia, podría tener diferentes guiones como test, stopo restart, etc Tener esta estructura le permite tener diferentes configuraciones de inicio, sin abarrotar todo en app.js.

La forma correcta de iniciar su aplicación Express es:

npm start

Para implementar una aplicación Express 4.x en Heroku , agregue esto a su Procfile:

web: npm start

O si solo puede usar el script de inicio en su package.json, heroku lo usará automáticamente, lea más aquí

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

66
Gracias. Con su excelente explicación en los últimos dos párrafos, finalmente entendí cuál es el punto de usar www. Sin embargo, no estoy seguro de por qué se llama así, ¿tal vez por la World Wide Web?
Blaszard

1
@ NicolasS.Xu En el repositorio de Github de ExpressJS github.com/visionmedia/express , desplácese hacia abajo hasta la sección Inicio rápido
Andy

44
@Ved ¿por qué "bin", sin embargo? Lo asocio con ejecutables binarios.
regularmike

2
@regularmike, supongo, también podría significar scripts 'ejecutables' (como en el entorno de Linux)
Andy

2
@Ved sí, parece que hace mucho tiempo evolucionó para significar algo ejecutable. Común en Python, Perl y unix / linux en general.
regularmike

10

Las aplicaciones de nodo como Express 3.x usan archivos de inicio no estándar app.js, pero es un archivo incorrecto para ejecutar.

package.json tiene

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

que establece la línea de comando de inicio. No es trivial porque potencialmente contiene una línea de comando completa, y no solo una ruta al archivo de inicio.


¿Puedes ayudarme a responder esta pregunta? ¡Gracias!
Nicolas S.Xu

77
¿Por qué se llama bin? No contiene binarios. . .
Kinnard Hockenhull

2

si está utilizando express-generator, solo mire su archivo local ./bin, hay un wwwarchivo dentro de ./bin. Entonces, cuando ejecuta node ./bin/www, node.js ejecutará el código en el wwwarchivo. Nada sofisticado.


y si está implementando en el servicio de aplicaciones de Azure, debe crear web.config y reemplazar todos index.js con bin / www, similar a ese documento gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna

1

En Windows, use este comando:

configure DEBUG = myapp: * & npm start Luego cargue http: // localhost: 3000 / en su navegador para acceder a la aplicación.


44
Bienvenido a SO! No creo que esto realmente responda la pregunta en cuestión. Vuelva a leer la pregunta para comprender completamente todo lo que el Cartel original está pidiendo.
Jake

0

Todo lo anterior ha respondido bien. Pero en caso de que quiera usar node app.jssolo versiones Express 3. * Puedes seguir a continuación:

Debido a que el archivo app.js generado por el generador Express 4 ahora es un módulo Node.js , ya no se puede iniciar de forma independiente como una aplicación (a menos que modifique el código). El módulo debe cargarse en un archivo Node.js e iniciarse mediante el archivo Node.js. El archivo Node.js es ./bin/www en este caso. Para más información, visite la documentación oficial .

Ni el directorio bin ni el archivo www sin extensión son obligatorios para crear una aplicación Express o iniciar la aplicación. Son solo sugerencias hechas por el generador, así que siéntase libre de modificarlas para satisfacer sus necesidades.

Para deshacerse del directorio www y mantener las cosas como "Express 3 way", elimine la línea que dice module.exports = app; al final del archivo app.js, luego pegue el siguiente código en su lugar:

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

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

Luego, cambie "start": "node ./bin/www"el archivo package.json . Desde entonces, ha movido la funcionalidad de ./bin/www de nuevo a app.js. Ahora, comience a usar "start": "node app.js"para ejecutar su aplicación express.


-1

pon esto en Procfile web: node ./bin/www y verifica si funciona foreman start. La aplicación debería estar disponible en el puerto 5000

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.