“ ./bin/www” ทำอะไรใน Express 4.x


157

ฉันเพิ่งเริ่มเรียนรู้เกี่ยวกับ Express 4.0 ในแอป Node.js ของฉันและฉันพบว่ามันสร้าง./bin/wwwไฟล์ซึ่งมีเพียงแอปพลิเคชันเซิร์ฟเวอร์และการตั้งค่าพอร์ตที่เขียนและทุกอย่างอื่น ๆ เช่นมิดเดิลแวร์และการกำหนดเส้นทางถูกกำหนดไว้ใน./app.jsไฟล์

อย่างไรก็ตามฉันไม่แน่ใจว่าสิ่งนี้./bin/wwwจะเป็นเช่นไร ผมเคยใช้ 3.x Express และผมได้กำหนดไว้เสมอเซิร์ฟเวอร์และพอร์ตการตั้งค่าเช่นเดียวกับการกำหนดเส้นทางและตัวกลางในเหมือนไฟล์และการเปิดตัวแอพพลิเคโหนดของฉันด้วย./app.js node app.jsดังนั้นจุดประสงค์ของการใช้./bin/wwwคืออะไร? มันแยกเฉพาะเซิร์ฟเวอร์และคำจำกัดความพอร์ตจากผู้อื่นหรือไม่

ตอนนี้เมื่อฉันสร้างแพคเกจโดยใช้เครื่องกำเนิดไฟฟ้าด่วนpackage.jsonรวมถึงคำจำกัดความต่อไปนี้:

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

แต่ผมสงสัยว่าผมควรจะเปิด app ของฉันโดยใช้หรือ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.jsonheroku จะใช้สิ่งนั้นโดยอัตโนมัติอ่านเพิ่มเติมที่นี่

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

6
ขอบคุณ wwwมีคำอธิบายที่ดีของคุณในสองย่อหน้าสุดท้ายในที่สุดผมก็มีสิ่งที่จุดของการใช้ ฉันไม่แน่ใจว่าทำไมถึงตั้งชื่อแบบนั้น - อาจตั้งชื่อตาม World Wide Web?
Blaszard

1
@ NicolasS.Xu บน Github repo github.com/visionmedia/expressของ ExpressJS เลื่อนลงไปที่ส่วนเริ่มต้นอย่างรวดเร็ว
Andy

4
@Ved ทำไม "bin" ถึงยังไง? ฉันเชื่อมโยงกับไบนารีที่ปฏิบัติการได้
regularmike

2
@ ผิดปกติฉันคิดว่ามันอาจหมายถึงสคริปต์ 'executable' (เช่นในสภาพแวดล้อมของ linux)
Andy

2
@Ved ใช่ดูเหมือนว่านานมาแล้วมันมีการพัฒนาเพื่อหมายถึงสิ่งที่ปฏิบัติการได้ ทั่วไปใน Python, Perl และ unix / linux โดยทั่วไป
regularmike

10

แอปที่มีโหนดอย่าง Express 3.x ใช้ไฟล์เริ่มต้นที่ไม่ได้มาตรฐานapp.jsแต่เป็นไฟล์ที่ไม่ถูกต้องในการทำงาน

package.json มี

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

ซึ่งระบุบรรทัดคำสั่งเริ่มต้น มันไม่สำคัญเพราะอาจมีบรรทัดคำสั่งแบบเต็มและไม่ใช่แค่พา ธ ไปยังไฟล์เริ่มต้น


คุณช่วยฉันตอบคำถามนี้ได้ไหม ขอบคุณ!
Nicolas S.Xu

7
ทำไมถึงเรียกว่าถังขยะ มันไม่มีไบนารี . .
Kinnard Hockenhull

2

หากคุณใช้เครื่องกำเนิดไฟฟ้าด่วนเพียงแค่ดูที่ไฟล์ในเครื่องของคุณ./binนั่นคือwwwไฟล์ที่อยู่ใน. / bin ดังนั้นเมื่อคุณเรียกใช้node ./bin/wwwnode.js จะรันโค้ดที่wwwไฟล์ ไม่มีอะไรแฟนซี


และถ้าคุณนำไปใช้กับบริการของแอป Azure, คุณต้องสร้าง web.config และแทนที่ index.js ทั้งหมดที่มี bin / www คล้ายกับเอกสารที่gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
Bishoy ฮันนา

1

บน Windows ให้ใช้คำสั่งนี้:

ตั้ง DEBUG = myapp: * & เริ่มต้น npm จากนั้นโหลดhttp: // localhost: 3000 /ในเบราว์เซอร์ของคุณเพื่อเข้าถึงแอป


4
ยินดีต้อนรับสู่ SO! ฉันไม่คิดว่านี่จะตอบคำถามในมือ โปรดอ่านคำถามอีกครั้งเพื่อให้เข้าใจอย่างถ่องแท้ถึงสิ่งที่โปสเตอร์ต้นฉบับร้องขอ
Jake

0

ทั้งหมดที่กล่าวมามีคำตอบที่ดี แต่ในกรณีที่คุณต้องการใช้node app.jsเฉพาะรุ่น Express 3 * เท่านั้น คุณสามารถติดตามด้านล่าง:

เนื่องจากไฟล์ app.js ที่สร้างโดยตัวสร้างExpress 4 กลายเป็นโมดูล Node.jsจึงไม่สามารถเริ่มแยกเป็นแอปได้อีกต่อไป (เว้นแต่คุณจะแก้ไขโค้ด) โมดูลจะต้องโหลดในไฟล์ Node.js และเริ่มต้นผ่านไฟล์ Node.js ไฟล์ Node.js คือ ./bin/www ในกรณีนี้ สำหรับข้อมูลเพิ่มเติมโปรดเยี่ยมชมเอกสารอย่างเป็นทางการ

ไม่ว่าจะเป็นไดเรกทอรีช่องเก็บหรือไฟล์ www ที่ไม่มีส่วนขยายสำหรับสร้างแอปด่วนหรือเริ่มต้นแอป พวกเขาเป็นเพียงคำแนะนำที่ทำโดยเครื่องกำเนิดดังนั้นอย่าลังเลที่จะปรับเปลี่ยนให้เหมาะกับความต้องการของคุณ

ในการกำจัดไดเรกทอรี www และทำให้สิ่งของ“ Express 3 way” ให้ลบบรรทัดที่ระบุว่า 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.