O que "./bin/www" faz no Express 4.x?


157

Comecei a aprender sobre o Express 4.0 no meu aplicativo Node.js. Descobri que ele gerava um ./bin/wwwarquivo, no qual apenas as configurações do servidor de aplicativos e da porta são gravadas e tudo o que outros como middleware e roteamento são definidos no ./app.jsarquivo.

No entanto, não tenho certeza do que isso ./bin/wwwfaz. Eu usei o Express 3.xe sempre defini configurações de servidor e porta, bem como roteamento e middleware no ./app.jsarquivo idêntico , e iniciei meu aplicativo de nó com node app.js. Então, qual é o sentido de usar o ./bin/www? Separa apenas a definição de servidor e porta das outras?

No momento, quando crio o pacote usando o express-generator, isso package.jsoninclui a seguinte definição:

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

No entanto, gostaria de saber se devo iniciar meu aplicativo usando node ./bin/www, ou npm start. Qual comando devo executar para iniciar meu aplicativo?

E também, quando implanto meu aplicativo no heroku, o que devo escrever no Procfilearquivo? É web: node app.jssuficiente?


Respostas:


131

No Express 3.0 , você normalmente usaria app.configure()(ou app.use()) para configurar o middleware necessário. O middleware que você especificou é empacotado junto com o Express 3.0.

Exemplo:

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

No Express 4.0 , no entanto, todos os middlewares foram removidos para que possam ser mantidos e atualizados independentemente do núcleo Express (exceto o middleware estático), portanto, eles precisam ser chamados separadamente (o que você vê em app.js).

O bin/diretório serve como um local onde você pode definir seus vários scripts de inicialização . Este wwwé um exemplo para iniciar o aplicativo expresso como um servidor da web.

Finalmente, você pode ter diferentes scripts como test, stopou restart, etc. Tendo esta estrutura permite que você tenha configurações de inicialização diferentes, sem colocar tudo em app.js.

A maneira correta de iniciar seu aplicativo Express é:

npm start

Para implantar um aplicativo Express 4.x no Heroku , adicione-o ao seu Procfile:

web: npm start

Ou, se você pode simplesmente usar o script de inicialização no package.jsonheroku, o heroku automaticamente o usa, leia mais aqui

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

6
Obrigado. Com sua excelente explicação nos dois últimos parágrafos, finalmente entendi qual é o sentido de usar www. Não sei ao certo por que é assim chamado - talvez com o nome de World Wide Web?
Blaszard

1
@ NicolasS.Xu No repositório do ExpressJS no Github , github.com/visionmedia/express , role para baixo até a seção Início rápido
Andy

4
@ Ved porque "bin", embora? Eu associo isso a executáveis ​​binários.
regularmike

2
@regularmike eu acho, poderia também scripts de meios 'executável' (como no ambiente do linux)
Andy

2
@ Sim, parece que há muito tempo evoluiu para significar qualquer coisa executável. Comum em Python, Perl e unix / linux em geral.
regularmike

10

Aplicativos de nó como o Express 3.x usam arquivos de inicialização não padrão app.js, mas é o arquivo errado para ser executado.

package.json tem

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

que indica a linha de comando de inicialização. Não é trivial porque potencialmente contém uma linha de comando completa, e não apenas um caminho para o arquivo inicial.


você pode me ajudar a responder a esta pergunta? Obrigado!
Nicolas S.Xu

6
Por que é chamado bin? Não contém binários. . .
Kinnard Hockenhull

2

se você estiver usando o express-generator, basta olhar para o arquivo local ./bin, existe um wwwarquivo dentro do ./bin. Portanto, quando você executa node ./bin/www, o node.js executa o código no wwwarquivo Nada chique.


e se você estiver implantando em serviço de aplicativo Azure, você tem que criar web.config e substituir todos os index.js com bin / www, semelhante a esse documento gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna

1

No Windows, use este comando:

defina DEBUG = myapp: * & npm start Carregue http: // localhost: 3000 / no seu navegador para acessar o aplicativo.


4
Bem-vindo ao SO! Eu não acho que isso realmente responda à pergunta em questão. Releia a pergunta para entender completamente tudo o que o Pôster original está perguntando.
Jake

0

Todos os itens acima responderam bem. Mas caso você queira usar node app.jsapenas as versões Express 3. *. Você pode seguir abaixo:

Como o arquivo app.js que foi gerado pelo gerador do Express 4 agora é um módulo Node.js. , ele não pode mais ser iniciado independentemente como um aplicativo (a menos que você modifique o código). O módulo deve ser carregado em um arquivo Node.js. e iniciado através do arquivo Node.js. O arquivo Node.js é ./bin/www neste caso. Para mais informações, visite a documentação oficial .

Nem o diretório bin nem o arquivo www sem extensão são obrigatórios para criar um aplicativo Express ou iniciar o aplicativo. São apenas sugestões feitas pelo gerador; sinta-se à vontade para modificá-las para atender às suas necessidades.

Para se livrar do diretório www e manter as coisas da “maneira 3 expressa”, exclua a linha que diz module.exports = app; no final do arquivo app.js, cole o seguinte código em seu lugar:

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

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

Em seguida, altere "start": "node ./bin/www"o arquivo package.json . Desde então, você mudou a funcionalidade de ./bin/www de volta para app.js. Agora, comece a usar "start": "node app.js"para executar seu aplicativo expresso.


-1

coloque isso no Procfile web: node ./bin/www e verifique se ele funciona foreman start. O aplicativo deve estar disponível na porta 5000

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.