Apa yang dilakukan “./bin/www” di Express 4.x?

157

Saya baru saja mulai belajar tentang Express 4.0 di aplikasi Node.js saya, dan saya menemukan bahwa itu menghasilkan ./bin/wwwfile, di mana hanya server aplikasi dan pengaturan port yang ditulis dan semua yang lain seperti middleware dan routing didefinisikan dalam ./app.jsfile.

Namun, saya tidak yakin apa ini ./bin/www. Saya telah menggunakan Express 3.x dan saya selalu mendefinisikan pengaturan server dan port serta perutean dan middleware pada ./app.jsfile yang sama , dan meluncurkan aplikasi node saya node app.js. Jadi apa gunanya menggunakan ./bin/www? Apakah hanya memisahkan definisi port dan server dari yang lain?

Saat ini, ketika saya membuat paket menggunakan express-generator, package.jsontermasuk definisi berikut:

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

Namun, saya bertanya-tanya apakah saya harus meluncurkan aplikasi saya menggunakan node ./bin/www, atau npm start. Perintah mana yang harus saya jalankan untuk memulai aplikasi saya?

Dan juga, ketika saya menyebarkan aplikasi saya ke heroku, apa yang harus saya tulis di Procfilefile? Apakah web: node app.jscukup?

Blaszard
sumber
1
Lihat Penjelasan terbaik di stackoverflow.com/a/36638353/984471
Manohar Reddy Poreddy

Jawaban:

131

Di Express 3.0 , Anda biasanya akan menggunakan app.configure()(atau app.use()) untuk mengatur middleware yang Anda butuhkan. Perangkat middleware yang Anda tentukan digabungkan bersama dengan Express 3.0.

Contoh:

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

Namun, dalam Express 4.0 , semua middleware telah dihapus sehingga mereka dapat dipertahankan dan diperbarui secara independen dari Core Express (kecuali middleware statis), sehingga mereka perlu dipanggil secara terpisah (apa yang Anda lihat app.js).

The bin/direktori berfungsi sebagai lokasi di mana Anda dapat menentukan berbagai Anda skrip startup . Ini wwwadalah contoh untuk memulai aplikasi ekspres sebagai server web.

Pada akhirnya, Anda bisa memiliki skrip yang berbeda seperti test,, stopatau restart, dll. Memiliki struktur ini memungkinkan Anda untuk memiliki konfigurasi startup yang berbeda, tanpa menjejalkan semuanya menjadi app.js.

Cara yang benar untuk memulai aplikasi Express Anda adalah:

npm start

Untuk menggunakan aplikasi Express 4.x ke Heroku , tambahkan ini ke Procfile:

web: npm start

Atau jika Anda bisa menggunakan skrip start di skrip Anda package.json, heroku akan secara otomatis menggunakannya, baca lebih lanjut di sini

"scripts": {
    "start": "node ./bin/www",
}
Andy
sumber
6
Terima kasih. Dengan penjelasan Anda yang luar biasa pada dua paragraf terakhir, saya akhirnya mengerti apa gunanya www. Saya tidak yakin mengapa namanya seperti itu - mungkin dinamai menurut World Wide Web?
Blaszard
1
@ NicolasS.Xu Pada ExpressJS's Github repo github.com/visionmedia/express , gulir ke bawah ke bagian Mulai cepat
Andy
4
@Ved mengapa "bin", sih? Saya mengaitkannya dengan executable biner.
regularmike
2
@ regularmike Saya kira, itu juga bisa berarti skrip 'dapat dieksekusi' (seperti di lingkungan linux)
Andy
2
@ Ved ya, sepertinya sudah lama berevolusi menjadi sesuatu yang dapat dieksekusi. Umum dalam Python, Perl, dan unix / linux secara umum.
mengaturarmike
10

Aplikasi Node seperti Express 3.x menggunakan file startup non-standar app.js, tapi itu file yang salah untuk dijalankan.

package.json telah

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

yang menyatakan baris perintah startup. Itu tidak sepele karena itu berpotensi berisi baris perintah penuh, dan bukan hanya path ke file starter.

4dgaurav
sumber
bisakah Anda membantu saya menjawab pertanyaan ini? Terima kasih!
Nicolas S.Xu
7
Mengapa ini disebut bin? Itu tidak mengandung binari. . .
Kinnard Hockenhull
2

Jika Anda menggunakan generator express, lihat saja file lokal Anda ./bin, terdapat wwwfile di dalam file ./bin. Jadi ketika Anda menjalankan node ./bin/www, node.js akan mengeksekusi kode pada wwwfile. Tidak ada yang mewah.

Max Ma
sumber
dan jika Anda menggunakan layanan aplikasi Azure, Anda harus membuat web.config dan mengganti semua index.js dengan bin / www, mirip dengan dokumen itu gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna
1

Di Windows, gunakan perintah ini:

atur DEBUG = myapp: * & npm start Kemudian muat http: // localhost: 3000 / di browser Anda untuk mengakses aplikasi.

pengguna11059213
sumber
4
Selamat datang di SO! Saya tidak berpikir ini benar-benar menjawab pertanyaan yang ada. Harap baca kembali pertanyaan untuk memahami sepenuhnya semua yang diminta oleh Poster Asli.
Jake
0

Semua jawaban di atas telah menjawab dengan baik. Tetapi jika Anda ingin menggunakan node app.jshanya seperti versi Express 3. *. Anda dapat mengikuti di bawah ini:

Karena file app.js yang dihasilkan oleh generator Express 4 sekarang menjadi modul Node.js , file itu tidak lagi dapat dimulai secara independen sebagai aplikasi (kecuali jika Anda memodifikasi kodenya). Modul harus dimuat dalam file Node.js dan dimulai melalui file Node.js. File Node.js adalah ./bin/www dalam kasus ini. Untuk info lebih lanjut, kunjungi dokumentasi resmi .

Baik direktori bin maupun file www tanpa ekstensi wajib untuk membuat aplikasi Express atau memulai aplikasi. Itu hanya saran yang dibuat oleh generator, jadi silakan memodifikasinya sesuai dengan kebutuhan Anda.

Untuk menyingkirkan direktori www dan menjaga hal-hal sebagai "Express 3 way", hapus baris yang mengatakan module.exports = app; di akhir file app.js, lalu tempel kode berikut ini sebagai gantinya:

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

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

Berikutnya, perubahan "start": "node ./bin/www"dalam package.json berkas. Karena, Anda sekarang telah memindahkan fungsi ./bin/www kembali ke app.js. Sekarang, mulai gunakan "start": "node app.js"untuk menjalankan aplikasi ekspres Anda.

Kapil Raghuwanshi
sumber
-1

taruh ini ke Procfile web: node ./bin/www dan periksa apakah itu berfungsi foreman start. Aplikasi harus tersedia di port 5000

timtch
sumber