Что делает «./bin/www» в Express 4.x?


157

Я только начал узнавать о Express 4.0 в своем приложении Node.js. Я обнаружил, что он генерирует ./bin/wwwфайл, в который записываются только настройки сервера приложений и портов, а все остальное, например, промежуточное программное обеспечение и маршрутизация, определяется в ./app.jsфайле.

Однако я не уверен, что это ./bin/wwwделает. Я использовал Express 3.x и всегда определял параметры сервера и порта, а также маршрутизацию и промежуточное ПО в одном и том же ./app.jsфайле и запускал приложение для узлов с помощью node app.js. Так какой смысл использовать ./bin/www? Разделяет ли он только сервер и определение порта от других?

Прямо сейчас, когда я создаю пакет с помощью экспресс-генератора, в него package.jsonвходит следующее определение:

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

Однако мне интересно, должен ли я запускать свое приложение, используя node ./bin/www, или npm start. Какую команду запустить, чтобы запустить мое приложение?

А также, когда я разверну свое приложение на heroku, что я должен написать в Procfileфайле? Есть web: node app.jsдостаточно?


1
См. Лучшее объяснение на stackoverflow.com/a/36638353/984471
Манохар Редди Poreddy

Ответы:


131

В Express 3.0 вы обычно используете app.configure()(или app.use()) для установки необходимого промежуточного программного обеспечения. Указанное вами промежуточное ПО поставляется вместе с Express 3.0.

Пример:

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

В Express 4.0, однако, все промежуточное программное обеспечение было удалено, чтобы его можно было поддерживать и обновлять независимо от ядра Express (кроме статического промежуточного программного обеспечения), поэтому их необходимо вызывать отдельно (как вы видите app.js).

bin/Каталог служит в качестве места , где вы можете определить ваши различные сценарии запуска . wwwЯвляется примером для запуска экспресс - приложение в качестве веб - сервера.

В конечном счете, у вас могут быть разные сценарии, такие как test, stopили restart, и т. Д. Наличие этой структуры позволяет вам иметь разные конфигурации запуска, не втискивая все в них app.js.

Правильный способ запустить приложение Express:

npm start

Чтобы развернуть приложение Express 4.x в Heroku , добавьте его в Procfile:

web: npm start

Или, если вы можете просто использовать стартовый скрипт в вашем package.json, heroku будет автоматически использовать это, подробнее здесь

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

6
Спасибо. С вашим превосходным объяснением в последних двух параграфах я наконец понял, какой смысл использовать www. Я не уверен, почему он так назван - может быть, назван в честь Всемирной паутины?
Blaszard

1
@ NicolasS.Xu В репозитории Github на ExpressJS github.com/visionmedia/express прокрутите вниз до раздела «Быстрый старт»
Энди,

4
@Ved почему "мусорное ведро", хотя? Я связываю это с двоичными исполняемыми файлами.
регулярное движение

2
@regularmike Я думаю, это также может означать «исполняемые» скрипты (как в среде Linux)
Энди

2
@ Вед, да, похоже, давным-давно это означало что-нибудь исполняемое. Часто встречается в Python, Perl и unix / linux.
регулярный мим

10

Нодовые приложения, такие как Express 3.x, используют нестандартные загрузочные файлы app.js, но это не тот файл, который нужно запустить.

package.json имеет

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

который заявляет командную строку запуска. Это нетривиально, потому что потенциально содержит полную командную строку, а не просто путь к начальному файлу.


не могли бы вы помочь мне ответить на этот вопрос? Спасибо!
Николас С. Сюй

7
Почему это называется бен? Не содержит двоичных файлов. , ,
Киннард Хоккенхалл

2

Если вы используете экспресс-генератор, просто посмотрите на ваш локальный файл, внутри ./bin ./binесть wwwфайл. Поэтому, когда вы запустите node ./bin/www, node.js выполнит код в wwwфайле. Ничего особенного.


и если вы развертываете в службу приложений Azure, вы должны создать web.config и заменить все index.js на bin / www, аналогично этому документу gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Ханна

1

В Windows используйте эту команду:

set DEBUG = myapp: * & npm start Затем загрузите http: // localhost: 3000 / в браузере, чтобы получить доступ к приложению.


4
Добро пожаловать на ТАК! Я не думаю, что это действительно отвечает на поставленный вопрос. Пожалуйста, перечитайте вопрос, чтобы полностью понять все, что просит Оригинальный постер.
Джейк

0

На все вышеизложенное ответили хорошо. Но в случае, если вы хотите использовать node app.jsтолько версии Express 3. *. Вы можете следовать ниже:

Поскольку файл app.js, сгенерированный генератором Express 4, теперь является модулем Node.js , он больше не может запускаться независимо как приложение (если вы не измените код). Модуль должен быть загружен в файл Node.js и запущен через файл Node.js. В этом случае файл Node.js - это ./bin/www. Для получения дополнительной информации посетите официальную документацию .

Ни каталог bin, ни файл www без расширений не являются обязательными для создания приложения Express или запуска приложения. Это всего лишь предложения, сделанные генератором, поэтому не стесняйтесь изменять их в соответствии с вашими потребностями.

Чтобы избавиться от каталога www и сохранить «экспресс 3 пути», удалите строку с именем module.exports = app; в конце файла app.js вставьте на его место следующий код:

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

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

Далее, изменение "start": "node ./bin/www"в package.json файле. С тех пор вы переместили функциональность ./bin/www обратно в app.js. Теперь начните использовать "start": "node app.js"для запуска вашего экспресс-приложения.


-1

поместите это в Procfile web: node ./bin/www и проверьте, работает ли он foreman start. Приложение должно быть доступно на порту 5000

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.