1. การติดตั้ง
คัดลอกรหัสดังนี้: $ npm ติดตั้ง Express
หรือใช้ Executable Express (1) ทุกที่ในการติดตั้ง:
คัดลอกรหัสดังต่อไปนี้:/# นักแปลหมายเหตุ: วิธีนี้แนะนำเป็นอย่างยิ่ง
$ npm ติดตั้ง -g Express
2. เริ่มต้นอย่างรวดเร็ว
วิธีที่เร็วที่สุดในการเริ่มต้นด้วย Express คือการใช้ Executable Express (1) เพื่อสร้างแอปพลิเคชันดังที่แสดงด้านล่าง:
สร้างแอพ:
การคัดลอกรหัสมีดังนี้:
$ npm ติดตั้ง -g Express
$ express /tmp /foo && cd /tmp /foo
ติดตั้งแพ็คเกจการพึ่งพา:
การคัดลอกรหัสมีดังนี้:
$ npm ติดตั้ง -d
เริ่มต้นเซิร์ฟเวอร์:
การคัดลอกรหัสมีดังนี้:
$ node app.js
3. สร้างเซิร์ฟเวอร์
ในการสร้างอินสแตนซ์ express.httpserver เพียงเรียกใช้เมธอด createserver () สำหรับตัวอย่างแอปพลิเคชันนี้เราสามารถกำหนดเส้นทางตามการกระทำของ HTTP (คำกริยา http) โดยใช้ app.get () เป็นตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var app = ต้องการ ('express'). createserver ();
app.get ('/', function (req, res) {
Res.Send ('Hello World');
-
app.listen (3000);
4. สร้างเซิร์ฟเวอร์ HTTPS
เริ่มต้นอินสแตนซ์ Express.httpsServer ดังกล่าวข้างต้น จากนั้นเราผ่านวัตถุการกำหนดค่าการยอมรับคีย์ใบรับรองและอื่น ๆ (คุณสมบัติ/วิธีการ) ที่กล่าวถึงในเอกสาร HTTPS
การคัดลอกรหัสมีดังนี้:
var app = ต้องการ ('express'). createserver ({key: ... });
V. การกำหนดค่า
Express สนับสนุนสภาพแวดล้อมใด ๆ เช่นขั้นตอนผลิตภัณฑ์และขั้นตอนการพัฒนา นักพัฒนาสามารถใช้วิธีการกำหนดค่า () เพื่อตั้งค่าสภาพแวดล้อมที่จำเป็นในปัจจุบัน หากการโทรไปที่กำหนดค่า () ไม่มีชื่อสภาพแวดล้อมใด ๆ มันจะทำงานบนการโทรกลับที่ระบุในทุกสภาพแวดล้อม
หมายเหตุของนักแปล: นามแฝงเช่นการผลิต/การพัฒนา/เวทีสามารถทำได้ด้วยตัวเองดังที่แสดงใน app.configure ใน application.js ดูตัวอย่างต่อไปนี้สำหรับการใช้งานจริง
ตัวอย่างต่อไปนี้เฉพาะ dumpexceptions (การขว้างข้อผิดพลาด) ในขั้นตอนการพัฒนาและส่งคืนข้อยกเว้นสแต็ก อย่างไรก็ตามในทั้งสองสภาพแวดล้อมเราใช้ Methodoverride และ Bodyparser ให้ความสนใจกับการใช้ App.Router ซึ่งสามารถใช้ (ไม่บังคับ) เพื่อโหลดเส้นทางของโปรแกรม นอกจากนี้เส้นทางจะถูกโหลดโดยการโทรหา app.get (), app.post () ฯลฯ เป็นครั้งแรก
การคัดลอกรหัสมีดังนี้:
app.configure (function () {
App.use (Express.Methodoverride ());
app.use (express.bodyparser ());
app.use (app.router);
-
app.configure ('การพัฒนา', function () {
app.use (express.static (__ dirname + '/public'));
App.use (Express.errorHandler ({dumpexceptions: จริง, showstack: true}));
-
app.configure ('การผลิต', function () {
var oneyear = 31557600000;
app.use (express.static (__ dirname + '/public', {maxage: oneyear}));
App.use (Express.errorHandler ());
-
สำหรับสภาพแวดล้อมที่คล้ายกันคุณสามารถผ่านหลายสายสภาพแวดล้อม:
การคัดลอกรหัสมีดังนี้:
app.configure ('stage', 'prod', function () {
// config
-
สำหรับการตั้งค่าภายในใด ๆ (#), Express มีชุด (คีย์ [, val]), เปิดใช้งาน (คีย์) และปิดใช้งาน (คีย์) วิธีการ:
หมายเหตุนักแปล: สำหรับรายละเอียดโปรดดูที่: application.js app.set
การคัดลอกรหัสมีดังนี้:
app.configure (function () {
app.set ('views', __dirname + '/views');
app.set ('views');
// => "/Absolute/Path/to/Views"
app.enable ('คุณสมบัติบางอย่าง');
// เทียบเท่ากับ: app.set ('คุณสมบัติบางอย่าง', จริง);
app.disable ('คุณสมบัติบางอย่าง');
// เทียบเท่ากับ: app.set ('คุณสมบัติบางอย่าง', false);
app.enabled ('คุณสมบัติบางอย่าง')
// => เท็จ
-
ในการเปลี่ยนแปลงสภาพแวดล้อมเราสามารถตั้งค่าตัวแปรสภาพแวดล้อม Node_env เช่น:
การคัดลอกรหัสมีดังนี้:
$ node_env = production node app.js
สิ่งนี้สำคัญมากเพราะกลไกการแคชส่วนใหญ่เปิดใช้งานเฉพาะในช่วงผลิตภัณฑ์
6. การตั้งค่า
Express รองรับการตั้งค่าทางลัดต่อไปนี้ (นอกกรอบ):
1.BasePath ใช้สำหรับเส้นทางฐานแอปพลิเคชันของ Res.redirect () ซึ่งจัดการแอพที่ติดตั้งอย่างชัดเจน
2. ดูมุมมองไดเรกทอรีรูทเริ่มต้นคือ CWD/มุมมอง
3. View Engine การประมวลผลมุมมองเริ่มต้น (ดูไฟล์) ไม่จำเป็นต้องใช้คำต่อท้าย
4. ดูแคชเปิดใช้งานแคช View (เปิดใช้งานในขั้นตอนผลิตภัณฑ์)
5. การเปลี่ยนแปลงการเปลี่ยนแปลงค่าเริ่มต้นคือ UTF-8
6. เส้นทางเส้นทางที่ละเอียดอ่อนเส้นทางที่ละเอียดอ่อน
7. หลังจากเปิดใช้งานการกำหนดเส้นทาง strit (ในเส้นทาง) สิ้นสุด/จะไม่ถูกละเว้น (หมายเหตุการแปล: นั่นคือ app.get ('/sofish') และ app.get ('/sofish/') จะแตกต่างกัน)
8.JSON การโทรกลับเปิดใช้งาน Res.Send () / res.json () การสนับสนุน JSONP ที่ชัดเจน (การสนับสนุน JSONP โปร่งใส)
7. การกำหนดเส้นทาง
Express ใช้การกระทำ HTTP เพื่อจัดเตรียมชุด APIs ที่รวดเร็วและการแสดงออก ตัวอย่างเช่นหากคุณต้องการจัดการกับบัญชีที่มีเส้นทางของ /ผู้ใช้ /12 เราสามารถกำหนดเส้นทางดังนี้ ค่าที่เกี่ยวข้องกับตัวยึดตำแหน่งที่มีชื่อสามารถเข้าถึงได้โดย REQ.Params
การคัดลอกรหัสมีดังนี้:
app.get ('/user/: id', function (req, res) {
Res.Send ('ผู้ใช้' + req.params.id);
-
เส้นทางคือสตริงที่รวบรวมภายในเป็นประจำ ตัวอย่างเช่นเมื่อ /user /: id ถูกรวบรวมเวอร์ชันที่เรียบง่ายของนิพจน์ทั่วไปจะประมาณดังนี้:
การคัดลอกรหัสมีดังนี้:
// แก้ไขสตริงอย่างเป็นทางการ
/// ผู้ใช้ // ([^//]+) //?/
การแสดงออกปกติสามารถส่งผ่านและนำไปใช้กับสถานการณ์ที่ซับซ้อน เนื่องจากกลุ่มเนื้อหาที่บันทึกโดยการแสดงออกปกติตามตัวอักษรนั้นไม่ระบุชื่อเราอาจเข้าถึงได้โดยตรงผ่าน REQ.Params ดังนั้นเนื้อหาชุดแรกที่เราจับจะเป็น req.params [0] ในขณะที่ชุดที่สองจะตามมาทันทีด้วย req.params [1]
การคัดลอกรหัสมีดังนี้:
app.get (/^// ผู้ใช้? (?: // (/d+) (?: /./. (/d+))?)?/, ฟังก์ชั่น (req, res) {
Res.Send (req.Params);
-
คำขอ Curl สำหรับเส้นทางที่กำหนดไว้ข้างต้น:
การคัดลอกรหัสมีดังนี้:
$ curl http: // dev: 3000/ผู้ใช้
[NULL, NULL]
$ curl http: // dev: 3000/ผู้ใช้
[NULL, NULL]
$ curl http: // dev: 3000/ผู้ใช้/1
["1", null]
$ curl http: // dev: 3000/ผู้ใช้/1..15
["1", "15"]
นี่คือตัวอย่างของเส้นทางที่เกี่ยวข้องกับเส้นทางที่พวกเขาอาจใช้:
การคัดลอกรหัสมีดังนี้:
"/ผู้ใช้/: id"
/ผู้ใช้/12
"/ผู้ใช้/: id?"
/ผู้ใช้/5
/ผู้ใช้
"/ไฟล์/*"
/files/jquery.js
/files/javascripts/jquery.js
"/ไฟล์/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/ผู้ใช้/: ID/: การดำเนินการ?"
/ผู้ใช้/1
/ผู้ใช้/1/แก้ไข
"/products.: format"
/products.json
/products.xml
"/products.: format?"
/products.json
/products.xml
/สินค้า
"/user/:id.:Format?"
/ผู้ใช้/12
/user/12.json
ตัวอย่างเช่นเราสามารถใช้โพสต์เพื่อส่งข้อมูล JSON และใช้ bodyparser มิดเดิลแวร์ที่สามารถแยกวิเคราะห์เนื้อหาคำขอ JSON (หรือเนื้อหาอื่น ๆ ) เพื่อส่งคืนข้อมูลและจัดเก็บผลตอบแทนใน req.body:
การคัดลอกรหัสมีดังนี้:
var express = ต้องการ ('ด่วน')
, app = express.createServer ();
app.use (express.bodyparser ());
app.post ('/', function (req, res) {
Res.Send (req.body);
-
app.listen (3000);
โดยปกติแล้วเราสามารถใช้ตัวยึดสไตล์ "คนโง่" เช่นผู้ใช้/: ID โดยไม่มีข้อ จำกัด (ชื่อ) อย่างไรก็ตามตัวอย่างเช่นหากเราต้องการ จำกัด ID ผู้ใช้ให้เป็นเพียงตัวเลขเราอาจใช้ /ผู้ใช้ /: ID ([0-9]+) ซึ่งจะมีผลถ้าตัวยึดตำแหน่งมีอย่างน้อยหนึ่งหมายเลข (ปรับการจับคู่)
8. การควบคุมเส้นทางผ่าน
เราสามารถควบคุมเส้นทางที่ปรับเปลี่ยนถัดไปได้โดยเรียกใช้พารามิเตอร์ที่สาม, ฟังก์ชันถัดไป () หากไม่พบการปรับตัวการควบคุมจะถูกส่งกลับไปยังการเชื่อมต่อและมิดเดิลแวร์จะถูกเรียกตามลำดับในลำดับที่เพิ่มเข้ามาในการใช้งาน () หลักการยังใช้กับหลายเส้นทางที่กำหนดไว้ในเส้นทางเดียวกันและพวกเขาจะถูกเรียกในทางกลับกันจนกว่าหนึ่งในนั้นจะไม่โทรต่อไป () และตัดสินใจที่จะตอบกลับคำขอ
การคัดลอกรหัสมีดังนี้:
app.get ('/users/: id?', function (req, res, ถัดไป) {
var id = req.params.id;
ถ้า (id) {
// ทำอะไรบางอย่าง
} อื่น {
ต่อไป();
-
-
app.get ('/ผู้ใช้', ฟังก์ชั่น (req, res) {
// ทำอย่างอื่น
-
เมธอด App.All () สามารถถ่ายโอนตรรกะเดียวกันไปยังการกระทำ HTTP ทั้งหมดได้อย่างง่ายดายโดยเรียกมันครั้งเดียว ต่อไปเราใช้มันเพื่อแยกผู้ใช้จาก Pseudo-Data และกำหนดให้กับ req.user
การคัดลอกรหัสมีดังนี้:
var express = ต้องการ ('ด่วน')
, app = express.createServer ();
ผู้ใช้ var = [{ชื่อ: 'tj'}];
app.all ('/user/: id/: op?', function (req, res, ถัดไป) {
req.user = ผู้ใช้ [req.params.id];
ถ้า (req.user) {
ต่อไป();
} อื่น {
ถัดไป (ข้อผิดพลาดใหม่ ('ไม่พบผู้ใช้' + req.params.id));
-
-
app.get ('/user/: id', function (req, res) {
Res.Send ('ดู' + req.user.name);
-
app.get ('/user/: id/edit', function (req, res) {
Res.Send ('แก้ไข' + req.user.name);
-
app.put ('/user/: id', function (req, res) {
Res.Send ('อัปเดต' + req.user.name);
-
app.get ('*', function (req, res) {
Res.Send (404, 'What ???');
-
app.listen (3000);
9. มิดเดิลแวร์
มิดเดิลแวร์เชื่อมต่อ (คุณสมบัติ) ที่ใช้มักจะมาพร้อมกับเซิร์ฟเวอร์การเชื่อมต่อปกติที่ส่งผ่านไปยัง Express.createServer () ชอบ:
การคัดลอกรหัสมีดังนี้:
var express = ต้องการ ('ด่วน');
var app = express.createServer (
Express.logger ()
, Express.bodyparser ()
-
นอกจากนี้ภายในบล็อก configure () - วังก้าวหน้านี้ (หมายเหตุของนักแปล: หัวเราะ ^^ ในลักษณะที่ก้าวหน้า) เราสามารถใช้งานได้อย่างสะดวกเพื่อเพิ่มมิดเดิลแวร์
การคัดลอกรหัสมีดังนี้:
app.use (express.logger ({รูปแบบ: ': วิธี: url'}));
โดยปกติการใช้มิดเดิลแวร์เชื่อมต่อที่คุณอาจใช้ต้องการ ('เชื่อมต่อ') เช่นนี้:
การคัดลอกรหัสมีดังนี้:
var connect = ต้องการ ('เชื่อมต่อ');
app.use (connect.logger ());
app.use (connect.bodyparser ());
นี่ค่อนข้างไม่เป็นที่พอใจในระดับหนึ่งดังนั้นแสดงการส่งออกคุณสมบัติมิดเดิลแวร์เหล่านี้อีกครั้งแม้ว่าจะเหมือนกัน:
การคัดลอกรหัสมีดังนี้:
app.use (express.logger ());
app.use (express.bodyparser ());
ลำดับของมิดเดิลแวร์มีความสำคัญมาก เมื่อ Connect ได้รับคำขอมิดเดิลแวร์ตัวแรกที่เราส่งผ่านไปยัง CreateServer () หรือการใช้งาน () จะมาพร้อมกับพารามิเตอร์สามตัวคำขอการตอบสนองและฟังก์ชั่นการโทรกลับ (โดยปกติจะถัดไป) เมื่อเรียกว่าถัดไป () มันจะเป็นมิดเดิลแวร์ที่สองและอื่น ๆ นี่เป็นสิ่งที่ควรค่าแก่การสังเกตเพราะคนกลางจำนวนมากขึ้นอยู่กับกันและกัน ตัวอย่างเช่น Methodoverride () ค้นหาวิธี req.body เพื่อตรวจจับวิธี HTTP ที่โอเวอร์โหลด ในทางกลับกัน BodyParser () วิเคราะห์เนื้อหาที่ร้องขอและเก็บไว้ใน req.body อีกตัวอย่างหนึ่งคือการแยกวิเคราะห์คุกกี้และการสนับสนุนเซสชัน เราต้องใช้ () cookieparser () ก่อนแล้วจึงเซสชัน ()
แอปพลิเคชั่นด่วนจำนวนมากรวมถึงสายของแอป. ใช้ (app.router) ซึ่งอาจดูแปลก ๆ ในความเป็นจริงมันเป็นเพียงฟังก์ชั่นมิดเดิลแวร์ที่มีกฎการกำหนดเส้นทางที่กำหนดทั้งหมดและทำการค้นหาเส้นทางตามคำขอ URL ที่มีอยู่และวิธี HTTP Express ช่วยให้คุณสามารถตัดสินใจตำแหน่งได้ แต่โดยค่าเริ่มต้นจะถูกวางไว้ที่ด้านล่าง โดยการเปลี่ยนตำแหน่งของเส้นทางเราสามารถเปลี่ยนลำดับความสำคัญของมิดเดิลแวร์ตัวอย่างเช่นเราต้องการใช้รายงานข้อผิดพลาดเป็นมิดเดิลแวร์ล่าสุดเพื่อให้ข้อยกเว้นใด ๆ ที่ส่งผ่านไปยังถัดไป () สามารถจัดการได้ หรือเราต้องการให้บริการไฟล์แบบคงที่มีลำดับความสำคัญต่ำกว่าเพื่อให้เส้นทางของเรารับฟังการดาวน์โหลดคำขอไฟล์แบบคงที่เดียว ฯลฯ สิ่งนี้จะเป็นเช่นนี้:
การคัดลอกรหัสมีดังนี้:
App.use (Express.logger (... ));
app.use (express.bodyparser (... ));
App.use (Express.cookieparser (... ));
App.use (Express.session (... ));
app.use (app.router);
app.use (express.static (... ));
App.use (Express.errorHandler (... ));
ก่อนอื่นเราเพิ่ม logger () ซึ่งอาจมีวิธี req.end () ของโหนดโดยให้ข้อมูลเกี่ยวกับเวลาตอบสนองของเรา เนื้อหาของคำขอจะถูกแยกวิเคราะห์ (หากมีข้อมูล) ตามด้วยความละเอียดของคุกกี้และการสนับสนุนเซสชัน ในเวลาเดียวกัน Req.session จะถูกกำหนดเมื่อเส้นทางใน App.router ถูกเรียกใช้ ในเวลานี้เราไม่โทรต่อไป () ดังนั้นมิดเดิลแวร์แบบคงที่ () จะไม่ทราบเกี่ยวกับคำขอนี้ หากกำหนดเส้นทางต่อไปนี้เราสามารถบันทึกสถานะต่าง ๆ ปฏิเสธการดาวน์โหลดและใช้คะแนนดาวน์โหลด ฯลฯ
การคัดลอกรหัสมีดังนี้:
var downloads = {};
app.use (app.router);
app.use (express.static (__ dirname + '/public'));
app.get ('/*', function (req, res, ถัดไป) {
var file = req.params [0];
ดาวน์โหลด [ไฟล์] = ดาวน์โหลด [ไฟล์] || 0;
ดาวน์โหลด [ไฟล์] ++;
ต่อไป();
-
10. มิดเดิลแวร์การกำหนดเส้นทาง
การกำหนดเส้นทางสามารถใช้มิดเดิลแวร์ของเราเตอร์เพื่อส่งผ่านฟังก์ชั่นการโทรกลับมากกว่าหนึ่งรายการ (หรืออาร์เรย์) ลงในวิธีการของมัน คุณสมบัตินี้มีประโยชน์มากสำหรับการ จำกัด การเข้าถึงการดาวน์โหลดข้อมูลผ่านการกำหนดเส้นทางและอื่น ๆ
โดยปกติแล้วการดึงข้อมูลแบบอะซิงโครนัสอาจดูเหมือนตัวอย่างต่อไปนี้เราใช้: พารามิเตอร์ ID และพยายามโหลดผู้ใช้:
การคัดลอกรหัสมีดังนี้:
app.get ('/user/: id', function (req, res, ถัดไป) {
loaduser (req.params.id, ฟังก์ชั่น (err, ผู้ใช้) {
ถ้า (err) return next (err);
Res.Send ('การดูผู้ใช้' + user.name);
-
-
เพื่อให้แน่ใจว่าหลักการแห้งและปรับปรุงความสามารถในการอ่านเราสามารถใช้ตรรกะนี้กับมิดเดิลแวร์ ดังที่แสดงไว้ด้านล่างการสรุปตรรกะนี้ลงในมิดเดิลแวร์จะช่วยให้คุณสามารถนำกลับมาใช้ใหม่ได้ในขณะที่ทำให้มั่นใจได้ถึงความเรียบง่ายของการกำหนดเส้นทางของเรา
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น loaduser (req, res, ถัดไป) {
// คุณจะดึงผู้ใช้ของคุณจากฐานข้อมูล
var user = ผู้ใช้ [req.params.id];
ถ้า (ผู้ใช้) {
req.user = ผู้ใช้;
ต่อไป();
} อื่น {
ถัดไป (ข้อผิดพลาดใหม่ ('ไม่สามารถโหลดผู้ใช้' + req.params.id));
-
-
app.get ('/user/: id', loaduser, function (req, res) {
Res.Send ('การดูผู้ใช้' + req.user.name);
-
การกำหนดเส้นทางหลายครั้งสามารถนำไปใช้กับเลเยอร์ที่ลึกกว่าของตรรกะตามลำดับเช่นการ จำกัด การเข้าถึงบัญชีผู้ใช้ ตัวอย่างต่อไปนี้อนุญาตให้ผู้ใช้ที่ผ่านการรับรองความถูกต้องเพื่อแก้ไขบัญชี (ของเธอ) เท่านั้น
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น AndrestrictToself (req, res, ถัดไป) {
req.authenticateduser.id == req.user.id
- ต่อไป()
: ถัดไป (ข้อผิดพลาดใหม่ ('ไม่ได้รับอนุญาต'));
-
app.get ('/user/: id/edit', loaduser, AndrestrictToself, function (req, res) {
Res.Send ('การแก้ไขผู้ใช้' + req.user.name);
-
โปรดจำไว้เสมอว่าการกำหนดเส้นทางเป็นเพียงฟังก์ชั่นง่าย ๆ ดังที่แสดงด้านล่างเราสามารถกำหนดฟังก์ชั่นที่ส่งคืนมิดเดิลแวร์เพื่อสร้างโซลูชันที่แสดงออกและยืดหยุ่นได้มากขึ้น
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น Andrestrictto (บทบาท) {
ฟังก์ชั่น return (req, res, ถัดไป) {
req.authenticateduser.role == บทบาท
- ต่อไป()
: ถัดไป (ข้อผิดพลาดใหม่ ('ไม่ได้รับอนุญาต'));
-
-
app.del ('/user/: id', loaduser, Andrestrictto ('admin'), ฟังก์ชั่น (req, res) {
Res.Send ('ผู้ใช้ที่ถูกลบ' + req.user.name);
-
มิดเดิลแวร์ที่ใช้กันทั่วไป "สแต็ก" สามารถส่งผ่านอาร์เรย์ (ซึ่งจะถูกนำไปใช้ซ้ำ) ซึ่งสามารถผสมและจับคู่กับระดับใดก็ได้
การคัดลอกรหัสมีดังนี้:
var a = [middleware1, middleware2]
, b = [middleware3, middleware4]
ทั้งหมด = [a, b];
app.get ('/foo', a, function () {});
app.get ('/bar', a, function () {});
app.get ('/', a, middleware3, middleware4, function () {});
app.get ('/', a, b, function () {});
app.get ('/', ทั้งหมด, function () {});
สำหรับรหัสที่สมบูรณ์ของอินสแตนซ์นี้โปรดดูที่เก็บตัวอย่างของเส้นทางมิดเดิลแวร์
เราอาจมีหลายครั้งที่จะ "ข้าม" มิดเดิลแวร์การกำหนดเส้นทางที่เหลืออยู่และยังคงจับคู่เส้นทางที่ตามมา ในการทำเช่นนี้เราเพียงแค่ต้องโทรต่อไป () ด้วยสตริง 'เส้นทาง' - ถัดไป ('เส้นทาง') หากไม่พบเส้นทางที่เหลือตรงกับ URL ที่ร้องขอ Express จะส่งคืน 404 ไม่พบ
11. วิธี HTTP
จนถึงตอนนี้ฉันได้สัมผัสกับ app.get () หลายครั้ง นอกจากนี้ Express ยังให้การกระทำ HTTP ทั่วไปอื่น ๆ เช่น app.post (), app.del () ฯลฯ
ตัวอย่างทั่วไปของการใช้งานโพสต์กำลังส่งแบบฟอร์ม ต่อไปเราเพียงแค่ตั้งค่าแอตทริบิวต์วิธีการของแบบฟอร์มเป็นโพสต์ใน HTML และการควบคุมจะถูกกำหนดให้กับเส้นทางที่กำหนดไว้ด้านล่าง
การคัดลอกรหัสมีดังนี้:
<form method = "post" action = "/">
<input type = "text" name = "ผู้ใช้ [ชื่อ]" />
<input type = "text" name = "ผู้ใช้ [อีเมล]" />
<อินพุตประเภท = "ส่ง" value = "ส่ง" />>>
</form>
โดยค่าเริ่มต้น Express ไม่ทราบวิธีจัดการเนื้อหาของคำขอนี้ดังนั้นเราต้องเพิ่มตัวมิดเดิลแวร์ BodyParser ซึ่งจะแยกวิเคราะห์เนื้อหาของแอปพลิเคชัน/X-WWW-FORM-URLENCODED และคำขอแอปพลิเคชัน/JSON และจัดเก็บตัวแปรใน req.body เราสามารถใช้มิดเดิลแวร์นี้เช่นตัวอย่างต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
app.use (express.bodyparser ());
ดังนี้เส้นทางของเราจะสามารถเข้าถึงวัตถุ req.body.user และเมื่อกำหนดชื่อและอีเมลจะมีคุณสมบัติทั้งสองนี้ (หมายเหตุการแปล: หากเนื้อหาที่ส่งโดยแบบฟอร์มไม่ว่างเปล่า)
การคัดลอกรหัสมีดังนี้:
app.post ('/', function (req, res) {
console.log (req.body.user);
res.redirect ('back');
-
เมื่อคุณต้องการใช้วิธีการเช่นใส่ในรูปแบบเราสามารถใช้อินพุตที่ซ่อนอยู่ชื่อ _Method ซึ่งสามารถใช้ในการปรับเปลี่ยนวิธี HTTP ในการทำเช่นนี้เราต้องใช้ Methodoverride Middleware ก่อนซึ่งจะต้องปรากฏขึ้นหลังจาก BodyParser เพื่อใช้ค่าฟอร์มที่มีอยู่ใน req.body
การคัดลอกรหัสมีดังนี้:
app.use (express.bodyparser ());
App.use (Express.Methodoverride ());
เหตุใดวิธีการเหล่านี้จึงไม่ได้เป็นเจ้าของโดยค่าเริ่มต้น? พูดง่ายๆคือมันเป็นเพราะไม่จำเป็นสำหรับฟังก์ชันการทำงานที่สมบูรณ์ที่ Express ต้องการ การใช้วิธีการขึ้นอยู่กับแอปพลิเคชันของคุณคุณอาจไม่ต้องการและลูกค้ายังสามารถใช้วิธีการเช่นวางและลบและคุณสามารถใช้โดยตรงเพราะ Methodoverride เป็นทางออกที่ดีมากสำหรับแบบฟอร์ม นี่คือการสาธิตวิธีการใช้งานซึ่งอาจมีลักษณะ:
การคัดลอกรหัสมีดังนี้:
<form method = "post" action = "/">
<input type = "hidden" name = "_ method" value = "Put" />
<input type = "text" name = "ผู้ใช้ [ชื่อ]" />
<input type = "text" name = "ผู้ใช้ [อีเมล]" />
<อินพุตประเภท = "ส่ง" value = "ส่ง" />>>
</form>
app.put ('/', function () {
console.log (req.body.user);
res.redirect ('back');
-
12. การจัดการข้อผิดพลาด
Express ให้วิธีการ App.error () เพื่อให้ข้อยกเว้นที่ได้รับจะถูกโยนลงไปในเส้นทางหรือส่งผ่านไปยังถัดไป (ERR) ตัวอย่างต่อไปนี้จะจัดการหน้าต่างๆตามข้อยกเว้นที่ไม่ได้กำหนดเฉพาะ:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น notfound (msg) {
this.name = 'notfound';
error.call (นี่, msg);
ข้อผิดพลาด.
-
notfound.prototype .__ proto__ = error.prototype;
app.get ('/404', function (req, res) {
โยนสิ่งใหม่ ๆ
-
app.get ('/500', ฟังก์ชั่น (req, res) {
โยนข้อผิดพลาดใหม่ ('แมวคีย์บอร์ด!');
-
ตามที่อธิบายไว้ด้านล่างเราสามารถเรียก app.error () หลายครั้ง ที่นี่เราตรวจพบอินสแตนซ์ที่ไม่ได้รับการก่อตั้งและแสดงหน้า 404 หรือส่งผ่านไปยังตัวจัดการข้อผิดพลาดถัดไป เป็นที่น่าสังเกตว่าโปรเซสเซอร์เหล่านี้สามารถกำหนดได้ทุกที่เพราะพวกเขาจะถูกวางไว้ใต้ตัวประมวลผลการกำหนดเส้นทางเมื่อฟัง () ฟัง ช่วยให้คำจำกัดความภายในบล็อก configure () เพื่อให้เราสามารถใช้วิธีการจัดการข้อยกเว้นที่แตกต่างกันตามสภาพแวดล้อม
การคัดลอกรหัสมีดังนี้:
app.error (ฟังก์ชั่น (err, req, res, ถัดไป) {
if (err instanceof notfound) {
res.render ('404.jade');
} อื่น {
ถัดไป (เอ่อ);
-
-
เพื่อความเรียบง่ายที่นี่เราคิดว่าข้อผิดพลาดทั้งหมดของการสาธิตนี้คือ 500 และแน่นอนคุณสามารถเลือกสิ่งที่คุณชอบ เมื่อเรียกใช้การเรียกระบบไปยังระบบไฟล์เช่นโหนดคุณอาจได้รับข้อผิดพลาดรหัสด้วย enoent หมายถึง "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" ซึ่งเราสามารถใช้ในตัวจัดการข้อผิดพลาดหรือแสดงหน้าระบุเมื่อจำเป็น
การคัดลอกรหัสมีดังนี้:
app.error (ฟังก์ชั่น (err, req, res) {
res.render ('500.jade', {
ข้อผิดพลาด: เอ่อ
-
-
แอพของเรายังสามารถใช้มิดเดิลแวร์ Error Handler ของ Connect เพื่อรายงานข้อยกเว้น ตัวอย่างเช่นเมื่อเราต้องการส่งออกข้อยกเว้น Stderr ในสภาพแวดล้อม "การพัฒนา" เราสามารถใช้:
การคัดลอกรหัสมีดังนี้:
App.use (Express.errorHandler ({dumpexceptions: true}));
ในเวลาเดียวกันในระหว่างขั้นตอนการพัฒนาเราอาจต้องแสดงข้อยกเว้นที่เราผ่านและโยนในหน้า HTML แฟนซีซึ่งเราสามารถตั้งค่าการแสดงเป็น TRUE
การคัดลอกรหัสมีดังนี้:
App.use (Express.errorHandler ({Showstack: จริง, dumpexceptions: true}));
Middleware Error Handler สามารถส่งคืน JSON เมื่อยอมรับ: แอปพลิเคชัน/JSON มีอยู่ซึ่งมีประโยชน์มากสำหรับการพัฒนาแอปพลิเคชันที่พึ่งพา JavaScript ไคลเอนต์เป็นอย่างมาก
13. พารามิเตอร์เส้นทางการประมวลผลล่วงหน้า
การกำหนดเส้นทางพารามิเตอร์การประมวลผลล่วงหน้าผ่านการโหลดข้อมูลโดยนัยและการตรวจสอบการร้องขอสามารถปรับปรุงความสามารถในการอ่านโปรแกรมของคุณได้อย่างมาก ตัวอย่างเช่นคุณมักจะต้องได้รับข้อมูลพื้นฐานจากหลายเส้นทางอย่างต่อเนื่อง ตัวอย่างเช่นการโหลดผู้ใช้ที่มี /ผู้ใช้ /: id เราอาจทำสิ่งนี้:
การคัดลอกรหัสมีดังนี้:
app.get ('/user/: userId', function (req, res, ถัดไป) {
user.get (req.params.userid, function (err, user) {
ถ้า (err) return next (err);
Res.Send ('ผู้ใช้' + user.name);
-
-
ผ่านการประมวลผลล่วงหน้าพารามิเตอร์ของเราสามารถแมปกับการโทรกลับที่ดำเนินการตรวจสอบความถูกต้องการควบคุมและแม้แต่โหลดข้อมูลจากฐานข้อมูล ดังนี้เราเรียก App.param () ด้วยชื่อพารามิเตอร์และหวังว่าจะแมปกับมิดเดิลแวร์บางตัว อย่างที่คุณเห็นเรายอมรับพารามิเตอร์ ID ที่แสดงถึงค่าตัวยึดตำแหน่ง การใช้สิ่งนี้เราจะโหลดผู้ใช้ตามปกติและจัดการกับข้อผิดพลาดและเพียงแค่โทรไปที่ถัดไป () เพื่อควบคุมการควบคุมไปยังตัวประมวลผลล่วงหน้าหรือโปรเซสเซอร์การกำหนดเส้นทางถัดไป
การคัดลอกรหัสมีดังนี้:
app.param ('userid', ฟังก์ชั่น (req, res, ถัดไป, id) {
user.get (id, function (err, user) {
ถ้า (err) return next (err);
if (! ผู้ใช้) ส่งคืนถัดไป (ข้อผิดพลาดใหม่ ('ไม่พบผู้ใช้'));
req.user = ผู้ใช้;
ต่อไป();
-
-
เมื่อทำสิ่งนี้เสร็จแล้วด้านบนจะปรับปรุงความสามารถในการอ่านเส้นทางได้อย่างมากและช่วยให้เราสามารถแบ่งปันตรรกะได้อย่างง่ายดายตลอดโปรแกรม:
การคัดลอกรหัสมีดังนี้:
app.get ('/user/: userId', ฟังก์ชั่น (req, res) {
Res.Send ('ผู้ใช้' + req.user.name);
-
14. ดูการประมวลผล
ไฟล์มุมมองใช้รูปแบบ <name>. <genens> โดยที่ <genens> เป็นชื่อของโมดูลที่ต้องการ ตัวอย่างเช่น layout.ejs จะบอกให้ระบบมุมมองต้องการ ('EJS') และโมดูลที่โหลดจะต้อง (ส่งออก) การส่งออก compile (str, ตัวเลือก) วิธีการและส่งคืนฟังก์ชั่นเพื่อปรับให้เข้ากับการแสดงออก app.register () สามารถใช้เพื่อเปลี่ยนพฤติกรรมเริ่มต้นนี้เป็นแผนที่ส่วนขยายไฟล์ไปยังเครื่องยนต์เฉพาะ ตัวอย่างเช่น "foo.html" สามารถประมวลผลโดย EJS
ตัวอย่างต่อไปนี้ใช้ Jade เพื่อประมวลผล index.html เนื่องจากเราไม่ได้ใช้เลย์เอาต์: เท็จเนื้อหาที่ประมวลผลโดย index.jade จะถูกส่งผ่านไปยังตัวแปรท้องถิ่นที่เรียกว่า body ใน layout.jade
การคัดลอกรหัสมีดังนี้:
app.get ('/', function (req, res) {
res.render ('index.jade', {title: 'เว็บไซต์ของฉัน'});
-
การตั้งค่า View View Engine ใหม่ช่วยให้เราสามารถระบุเอ็นจิ้นเทมเพลตเริ่มต้นตัวอย่างเช่นเมื่อเราใช้ Jade คุณสามารถตั้งค่าได้เช่นนี้:
การคัดลอกรหัสมีดังนี้:
app.set ('ดูเอ็นจิ้น', 'หยก');
อนุญาตให้เราจัดการสิ่งนี้:
การคัดลอกรหัสมีดังนี้:
res.render ('ดัชนี');
สอดคล้องกับ:
การคัดลอกรหัสมีดังนี้:
res.render ('index.jade');
เมื่อมีการตั้งค่า View Engine แล้วส่วนขยายเป็นทางเลือก แต่เรายังสามารถผสมเอ็นจิ้นเทมเพลตที่ตรงกัน:
การคัดลอกรหัสมีดังนี้:
res.render ('อีกหน้าหนึ่ง ejs');
Express ยังมีการตั้งค่าตัวเลือกมุมมองซึ่งจะนำไปใช้กับมุมมองทุกครั้งที่มีการแสดงผลตัวอย่างเช่นหากคุณไม่ต้องการใช้เลย์เอาต์:
การคัดลอกรหัสมีดังนี้:
app.set ('ตัวเลือกมุมมอง', {
เลย์เอาต์: เท็จ
-
สิ่งนี้สามารถเกินพิกัดภายในการโทร res.render () เมื่อจำเป็น:
การคัดลอกรหัสมีดังนี้:
res.render ('myview.ejs', {layout: true});
เมื่อมีความจำเป็นที่จะต้องเปลี่ยนเลย์เอาต์เรามักจะต้องระบุเส้นทางอื่น ตัวอย่างเช่นเมื่อเราตั้งค่า View Engine เป็น Jade และไฟล์มีชื่อ./views/mylayout.jade เราสามารถผ่านพารามิเตอร์:
การคัดลอกรหัสมีดังนี้:
res.render ('หน้า', {เลย์เอาต์: 'mylayout'});
มิฉะนั้น (หมายเหตุของนักแปล: เมื่อ View Engine ไม่ได้ตั้งค่าเป็น Jade หรือ Engine อื่น ๆ ) เราต้องระบุส่วนขยาย:
การคัดลอกรหัสมีดังนี้:
res.render ('หน้า', {เลย์เอาต์: 'mylayout.jade'});
พวกเขายังสามารถเป็นเส้นทางที่แน่นอน:
การคัดลอกรหัสมีดังนี้:
res.render ('หน้า', {เลย์เอาต์: __dirname + '/../../mylayout.jade'});
มีตัวอย่างที่ดีของสิ่งนี้ - ปรับแต่งแท็กเริ่มต้นและปิดของ EJS:
การคัดลอกรหัสมีดังนี้:
app.set ('ตัวเลือกมุมมอง', {
เปิด: '{{',
ปิด: '}}'
-
15. ดูชิ้นส่วน
ระบบมุมมองของ Express มีการสนับสนุนในตัวสำหรับชิ้นส่วนและคอลเลกชันซึ่งเทียบเท่ากับการแทนที่ส่วนเอกสารด้วยมุมมอง "มินิ" ตัวอย่างการเรนเดอร์ซ้ำ ๆ ในมุมมองเพื่อแสดงความคิดเห็นเราสามารถใช้ชุดชิ้นส่วน:
การคัดลอกรหัสมีดังนี้:
บางส่วน ('ความคิดเห็น', {คอลเลกชัน: ความคิดเห็น});
หากไม่จำเป็นต้องมีตัวเลือกอื่นหรือตัวแปรท้องถิ่นเราสามารถละเว้นวัตถุทั้งหมดและส่งผ่านไปยังอาร์เรย์ซึ่งเทียบเท่ากับด้านบน:
การคัดลอกรหัสมีดังนี้:
บางส่วน ('ความคิดเห็น', ความคิดเห็น);
ในการใช้งานชุดส่วนประกอบให้การสนับสนุน "วิเศษ" สำหรับตัวแปรท้องถิ่นฟรี:
1. Firstincollection จริงเมื่อมันเป็นวัตถุแรก
2. ดัชนีการรวบรวมในวัตถุคอลเลกชัน
3. lastincollection จริงเมื่อมันเป็นวัตถุสุดท้าย
4. ความยาวความยาวของวัตถุคอลเลกชัน
การถ่ายโอน (การสร้าง) ของตัวแปรท้องถิ่นมีลำดับความสำคัญสูงกว่า ในเวลาเดียวกันตัวแปรท้องถิ่นที่ส่งผ่านไปยังมุมมองหลักก็เหมาะสำหรับเด็ก ตัวอย่างเช่นเมื่อเราใช้บางส่วน ('บล็อก/โพสต์' โพสต์) เพื่อแสดงโพสต์บล็อกมันจะสร้างตัวแปรโพสต์ท้องถิ่น มีผู้ใช้ตัวแปรท้องถิ่นในมุมมองที่เรียกใช้ฟังก์ชันนี้ซึ่งจะถูกต้องสำหรับบล็อก/โพสต์ (หมายเหตุของนักแปล: ที่นี่บางส่วนเป็นเหมือนวิธีการรวมใน PHP)
หมายเหตุ: ใช้การรวบรวมชิ้นส่วนอย่างระมัดระวังการแสดงผลอาร์เรย์ของคอลเลกชันชิ้นส่วนที่มีความยาว 100 เทียบเท่ากับ 100 มุมมองที่เราต้องดำเนินการ สำหรับคอลเลกชันที่เรียบง่ายเป็นการดีที่สุดที่จะทำซ้ำในตัวแทนที่จะใช้ตัวรวบรวมส่วนประกอบเพื่อหลีกเลี่ยงค่าใช้จ่ายที่มากเกินไป
16. ดูการค้นหา
ดูการค้นหาจะดำเนินการสัมพันธ์กับมุมมองพาเรนต์ (พา ธ ) หากเรามีหน้ามุมมองที่เรียกว่า Views/User/list.jade และบางส่วน ('แก้ไข') จะถูกเขียนไว้ข้างในมันจะพยายามโหลดมุมมอง/ผู้ใช้/แก้ไข/แก้ไขและบางส่วน ('../ ข้อความ') จะโหลดมุมมอง/ข้อความ
ระบบมุมมองยังรองรับการจัดทำดัชนีเทมเพลตช่วยให้คุณสามารถใช้ไดเรกทอรีที่มีชื่อเดียวกับมุมมอง ตัวอย่างเช่นในเส้นทาง res.render ('ผู้ใช้') ได้รับที่ไม่ใช่มุมมอง/ผู้ใช้ Jade นั่นคือมุมมอง/ผู้ใช้/index.jade (หมายเหตุของนักแปล: ก่อนอื่นจัดการกับสถานการณ์ของ <ent>. <gensen> จากนั้นจัดการกับสถานการณ์ของ <path>/<index. <gen, engine> สำหรับรายละเอียดดู view.js. )
เมื่อใช้ดัชนีมุมมองด้านบนเราใช้บางส่วน ('ผู้ใช้') เพื่ออ้างถึงมุมมอง/ผู้ใช้/index.jade ในไดเรกทอรีเดียวกับมุมมอง ในเวลาเดียวกันระบบมุมมองจะพยายามทำดัชนี ../ ผู้ใช้/ดัชนีโดยไม่ต้องโทรหาบางส่วน ('ผู้ใช้')
17. เครื่องยนต์เทมเพลต
ต่อไปนี้เป็นเครื่องยนต์เทมเพลตที่ใช้กันมากที่สุดสำหรับ Express:
1. HAML: การใช้งาน HAML
2.JADE: ผู้สืบทอด HAML.JS
3.EJS: JavaScript แบบฝังตัว
4.CoffeeKUP: เทมเพลตที่ใช้ CoffeEscript
5. เจียมเคอรี่เทมเพลต
18. การสนับสนุนเซสชัน
การสนับสนุนเซสชันสามารถรับได้โดยใช้มิดเดิลแวร์เซสชันของ Connect ด้วยเหตุนี้เราจึงจำเป็นต้องนำหน้าด้วยมิดเดิลแวร์ Cookieparser ซึ่งจะแยกวิเคราะห์และจัดเก็บข้อมูลคุกกี้ใน req.cookies
การคัดลอกรหัสมีดังนี้:
App.use (Express.cookieparser ());
App.use (Express.session ({Secret: "คีย์บอร์ดแมว"}));
โดยค่าเริ่มต้น Session Middleware ใช้ที่เก็บหน่วยความจำในตัวของ Connect แต่มีการใช้งานอื่น ๆ อีกมากมาย ตัวอย่างเช่น Connect-Redis มีที่เก็บเซสชัน Redis ซึ่งสามารถใช้งานได้ดังต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
var redisstore = ต้องการ ('Connect-redis') (ด่วน);
App.use (Express.cookieparser ());
App.use (Express.session ({Secret: "คีย์บอร์ดแมว", ร้านค้า: ใหม่ redisstore}));
ณ จุดนี้คุณสมบัติ REQ.Session และ REQ.SessionStore จะถูกใช้โดยเส้นทางทั้งหมดและมิดเดิลแวร์ที่ตามมา คุณสมบัติทั้งหมดใน req.session จะถูกบันทึกโดยอัตโนมัติในการตอบกลับเช่นเมื่อเราต้องการเพิ่มข้อมูลลงในตะกร้าสินค้า:
การคัดลอกรหัสมีดังนี้:
var redisstore = ต้องการ ('Connect-redis') (ด่วน);
app.use (express.bodyparser ());
App.use (Express.cookieparser ());
App.use (Express.session ({Secret: "คีย์บอร์ดแมว", ร้านค้า: ใหม่ redisstore}));
app.post ('/add-to-cart', function (req, res) {
// เราอาจโพสต์หลายรายการผ่านแบบฟอร์มเดียว
// (ในบางกรณีใช้มิดเดิลแวร์ bodyparser ())
รายการ var = req.body.items;
req.session.items = รายการ;
res.redirect ('back');
-
app.get ('/add-to-cart', function (req, res) {
// เมื่อกลับมาหน้ารับ /add-to-cart
// เราสามารถตรวจสอบ req.session.items && req.session.items.length
// พิมพ์พรอมต์
if (req.session.items && req.session.items.length) {
req.Notify ('ข้อมูล', 'คุณมีรายการ %s ในรถเข็นของคุณ', req.session.items.length);
-
res.render ('ช้อปปิ้ง-รถเข็น');
-
สำหรับ req.session มันยังมีวิธีการเช่นเซสชัน#touch () เซสชัน#destroy () เซสชัน#regenerate () ฯลฯ เพื่อรักษาและใช้งานเซสชัน สำหรับรายละเอียดเพิ่มเติมโปรดดูเอกสารประกอบการเชื่อมต่อ
19. คู่มืออัปเกรด
สำหรับนักเรียนที่ใช้ Express 1.x หากคุณมีโปรแกรมสำคัญที่จำเป็นต้องอัพเกรดเป็น 2.x เพื่อการสนับสนุนที่ดีขึ้นโปรดดูคู่มือการย้ายถิ่นอย่างละเอียดอย่างเป็นทางการ: http://expressjs.com/guide.html#migration-guide