Що робить "./bin/www" у Express 4.x?


157

Я щойно почав дізнаватися про експрес 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
Manohar Reddy 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 repo github.com/visionmedia/express ExpressJS прокрутіть вниз до розділу Швидкий старт
Енді

4
@Ved чому хоч "бін"? Я пов'язую це з бінарними виконуваними файлами.
регулярниймійк

2
@regularmike Я думаю, це також може означати "виконувані" сценарії (наприклад, в середовищі Linux)
Енді

2
@Ved так, здається, що давно це розвивалося, щоб означати що-небудь виконане. Поширений у Python, Perl та unix / linux взагалі.
регулярниймійк

10

Додаткові вузли, такі як Express 3.x, використовують нестандартні файли запуску app.js, але це неправильний файл.

package.json має

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

в якому вказано командний рядок запуску. Це нетривіально, оскільки потенційно містить повний командний рядок, а не лише шлях до початкового файлу.


чи можете ви допомогти мені відповісти на це питання? Дякую!
Nicolas S.Xu

7
Чому його називають бін? Він не містить двійкових файлів. . .
Кіннард Хокенхолл

2

якщо ви використовуєте експрес-генератор, просто подивіться на ваш локальний файл ./bin, там знаходиться wwwфайл ./bin. Отже, коли ви запустите node ./bin/www, node.js виконає код у wwwфайлі. Нічого фантазійного.


і якщо ви розгортаєтесь до служби додатків Azure, вам потрібно створити web.config і замінити всі index.js на bin / www, подібно до цього документа gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna

1

У Windows використовуйте цю команду:

встановити DEBUG = myapp: * & npm start Потім завантажте http: // localhost: 3000 / у свій браузер, щоб отримати доступ до програми.


4
Ласкаво просимо до SO! Я не думаю, що це справді відповідає на питання. Будь ласка, перечитайте питання, щоб повністю зрозуміти все, що задає Оригінальний плакат.
Джейк

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.