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?

Blaszard
fonte
1
Veja a melhor explicação em stackoverflow.com/a/36638353/984471
Manohar Reddy Poreddy

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",
}
Andy
fonte
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.

4dgaurav
fonte
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.

Max Ma
fonte
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.

user11059213
fonte
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.

Kapil Raghuwanshi
fonte
-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

timtch
fonte