Không có gì ./bin / www, làm gì trong Express 4.x?


157

Tôi mới bắt đầu tìm hiểu về Express 4.0 trong ứng dụng Node.js của mình và tôi thấy rằng nó đã tạo ./bin/wwwtệp, trong đó chỉ có các cài đặt máy chủ và cổng ứng dụng được viết và mọi thứ khác như phần mềm trung gian và định tuyến được xác định trong ./app.jstệp.

Tuy nhiên, tôi không chắc điều này ./bin/wwwlàm gì . Tôi đã sử dụng Express 3.x và tôi luôn xác định cài đặt máy chủ và cổng cũng như định tuyến và phần mềm trung gian trên cùng một ./app.jstệp và khởi chạy ứng dụng nút của mình với node app.js. Vậy quan điểm của việc sử dụng là ./bin/wwwgì? Có phải nó chỉ tách định nghĩa máy chủ và cổng từ những người khác?

Ngay bây giờ, khi tôi tạo gói bằng trình tạo tốc độ, package.jsonbao gồm định nghĩa sau:

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

Tuy nhiên, tôi tự hỏi liệu tôi có nên khởi chạy ứng dụng của mình bằng cách sử dụng node ./bin/wwwhay npm start. Tôi nên chạy lệnh nào để khởi động ứng dụng của mình?

Và ngoài ra, khi tôi triển khai ứng dụng của mình lên heroku, tôi nên viết gì trong Procfiletệp? Là web: node app.jsđủ?


1
Xem Giải thích tốt nhất tại stackoverflow.com/a/36638353/984471
Manohar Reddy Poreddy

Câu trả lời:


131

Trong Express 3.0 , thông thường bạn sẽ sử dụng app.configure()(hoặc app.use()) để thiết lập phần mềm trung gian cần thiết mà bạn cần. Các phần mềm trung gian mà bạn đã chỉ định được gói cùng với Express 3.0.

Thí dụ:

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

Tuy nhiên, trong Express 4.0 , tất cả phần mềm trung gian đã bị xóa để chúng có thể được duy trì và cập nhật độc lập với lõi Express (ngoại trừ phần mềm trung gian tĩnh), do đó chúng cần được gọi riêng (những gì bạn thấy trong app.js).

Thư mục bin/phục vụ như một vị trí nơi bạn có thể xác định các tập lệnh khởi động khác nhau của mình . Đây wwwlà một ví dụ để bắt đầu ứng dụng express như một máy chủ web.

Cuối cùng, bạn có thể có các tập lệnh khác nhau như test, stophoặc restart, v.v. Có cấu trúc này cho phép bạn có các cấu hình khởi động khác nhau, mà không nhồi nhét mọi thứ vào app.js.

Cách chính xác để bắt đầu ứng dụng Express của bạn là:

npm start

Để triển khai ứng dụng Express 4.x lên Heroku , hãy thêm ứng dụng này vào Procfile:

web: npm start

Hoặc nếu bạn chỉ có thể sử dụng tập lệnh bắt đầu package.json, heroku sẽ tự động sử dụng tập lệnh đó, đọc thêm tại đây

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

6
Cảm ơn. Với lời giải thích tuyệt vời của bạn về hai đoạn cuối, cuối cùng tôi đã hiểu ý nghĩa của việc sử dụng www. Tôi không chắc tại sao nó lại được đặt tên theo cách đó - có thể được đặt tên theo World Wide Web?
Blaszard

1
@ NicolasS.Xu Trên repith Github của ExpressJS github.com/visionmedia/express , cuộn xuống phần Bắt đầu nhanh
Andy

4
@Ved tại sao "bin", mặc dù? Tôi liên kết điều đó với thực thi nhị phân.
chỉnh

2
@regularmike Tôi đoán, nó cũng có thể có nghĩa là các tập lệnh 'có thể thực thi' (như trong môi trường của linux)
Andy

2
@Ved có, có vẻ như một thời gian dài trước đây nó đã phát triển có nghĩa là bất cứ điều gì có thể thực thi được. Nói chung trong Python, Perl và unix / linux nói chung.
Regarmike

10

Các ứng dụng nút như Express 3.x sử dụng các tệp khởi động không chuẩn app.js, nhưng đó là tệp sai để chạy.

package.json

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

trong đó nêu dòng lệnh khởi động. Nó không tầm thường bởi vì nó có khả năng chứa một dòng lệnh đầy đủ và không chỉ là đường dẫn đến tệp khởi động.


bạn có thể vui lòng giúp tôi trả lời câu hỏi này? Cảm ơn bạn!
Nicolas S.Xu

6
Tại sao lại gọi là bin? Nó không chứa nhị phân. . .
Kinnard Hockenhull

2

nếu bạn đang sử dụng trình tạo nhanh, chỉ cần nhìn vào tệp cục bộ của bạn ./bin, có wwwtệp bên trong ./bin. Vì vậy, khi bạn chạy node ./bin/www, node.js sẽ thực thi mã tại wwwtệp. Không có gì lạ mắt.


và nếu bạn đang triển khai dịch vụ ứng dụng Azure, bạn phải tạo web.config và thay thế tất cả index.js bằng bin / www, tương tự như tài liệu đó gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy Hanna

1

Trên Windows, sử dụng lệnh này:

đặt DEBUG = myapp: * & npm start Sau đó tải http: // localhost: 3000 / trong trình duyệt của bạn để truy cập ứng dụng.


4
Chào mừng đến với SO! Tôi không nghĩ rằng điều này thực sự trả lời câu hỏi trong tầm tay. Vui lòng đọc lại câu hỏi để hiểu đầy đủ tất cả những gì Poster gốc đang hỏi.
Jake

0

Tất cả những điều trên đã trả lời tốt. Nhưng trong trường hợp nếu bạn chỉ muốn sử dụng node app.jscác phiên bản Express 3. *. Bạn có thể làm theo dưới đây:

Vì tệp app.js được tạo bởi trình tạo Express 4 hiện là mô-đun Node.js , nên nó không còn có thể được khởi động độc lập như một ứng dụng (trừ khi bạn sửa đổi mã). Mô-đun phải được tải trong tệp Node.js và bắt đầu thông qua tệp Node.js. Tệp Node.js là ./bin/www trong trường hợp này. Để biết thêm thông tin, hãy truy cập tài liệu chính thức .

Cả thư mục bin lẫn tệp www mở rộng đều không bắt buộc để tạo ứng dụng Express hoặc khởi động ứng dụng. Chúng chỉ là những gợi ý được đưa ra bởi trình tạo, vì vậy hãy thoải mái sửa đổi chúng cho phù hợp với nhu cầu của bạn.

Để thoát khỏi thư mục www và giữ mọi thứ theo kiểu Express Express 3, hãy xóa dòng có tên module.exports = app; ở cuối tệp app.js, sau đó dán đoạn mã sau vào vị trí của nó:

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

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

Tiếp theo, thay đổi "start": "node ./bin/www"trong package.json tập tin. Kể từ đó, giờ bạn đã chuyển chức năng của ./bin/www trở lại app.js. Bây giờ, bắt đầu sử dụng "start": "node app.js"để chạy ứng dụng thể hiện của bạn.


-1

đặt cái này cho Procfile web: node ./bin/www và kiểm tra xem nó có hoạt động không foreman start. Ứng dụng nên có sẵn trên cổng 5000

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.