ความแตกต่างระหว่าง express.Router และ app.get หรือไม่


265

ฉันเริ่มต้นด้วย NodeJS และ Express 4 และฉันสับสนเล็กน้อย ฉันได้อ่านเว็บไซต์ Express แต่ไม่สามารถมองเห็นได้เมื่อexpress.Routerใช้ตัวจัดการเส้นทางหรือเมื่อใช้

อย่างที่ฉันเห็นถ้าฉันต้องการที่จะแสดงหน้าหรือบางสิ่งบางอย่างเมื่อผู้ใช้ฮิต /showเช่นฉันควรใช้:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

ในตอนแรกฉันคิดว่านี่เก่า (สำหรับ Express 3) ใช่หรือไม่และนี่เป็นวิธีสำหรับ Express 4 ด้วยหรือไม่

หากนี่คือวิธีที่จะทำใน Express 4 อะไรคือสิ่งที่ express.Routerไว้สำหรับอะไร?

ฉันอ่านตัวอย่างเกือบเหมือนข้างบน แต่ใช้express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

ดังนั้นทั้งสองตัวอย่างต่างกันอย่างไร

ฉันควรใช้อันไหนถ้าฉันต้องการทำเว็บไซต์ทดสอบง่ายๆ


27
Routerไม่ได้.listen()สำหรับการร้องขอในตัวเอง มันมีประโยชน์สำหรับการแยกแอปพลิเคชันของคุณออกเป็นหลายโมดูล - การสร้าง a Routerในแต่ละappกระป๋องrequire()และ.use()มิดเดิลแวร์
Jonathan Lonowski

5
ตามที่ @JonathanLonowski บอกเป็นนัยแล้วapp.get(..)ไวยากรณ์เป็นเพียงทางลัดเพื่อให้การทำงานexpress.routerสะดวกยิ่งขึ้น หากคุณเพิ่งเริ่มต้นไม่ต้องกังวลกับข้อมูลเฉพาะของเราเตอร์
soulprovidr

1
คุณกำลังบอกว่าฉันควรใช้แอพ get.get () ในขณะนี้เท่านั้น? ยังคงสับสนเกี่ยวกับเวลาที่จะใช้อย่างใดอย่างหนึ่ง
nelson687

11
@ nelson687 ไม่มีกฎที่แน่ชัดระหว่างพวกเขา หากคุณรู้สึกว่าapp'sวิธีการกำหนดเส้นทางของตัวเองเช่นapp.get()มีความเพียงพอสำหรับความต้องการของคุณให้ใช้วิธีดังกล่าว Routerเป็นเพียงมีเพื่อความสะดวกในการช่วยให้คุณจัดระเบียบแอปพลิเคข้ามโมดูลหลาย จากคู่มือ " ระดับสามารถนำมาใช้ในการสร้างแบบแยกส่วนตั้งกับรถขนเส้นทาง. เช่นเป็นตัวกลางที่สมบูรณ์และระบบการกำหนดเส้นทางสำหรับเหตุนี้จึงมักจะถูกเรียกว่าเป็น 'มินิแอป'. "express.RouterRouter
โจนาธาน Lonowski

คำตอบ:


323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

เมื่อvar app = express()ถูกเรียกวัตถุของแอปจะถูกส่งคืน คิดว่านี้เป็นapp หลัก

เมื่อvar router = express.Router()เรียกใช้แอปขนาดเล็กที่แตกต่างกันจะถูกส่งกลับ แนวคิดเบื้องหลังแอพขนาดเล็กคือแต่ละเส้นทางในแอพของคุณอาจมีความซับซ้อนมากและคุณจะได้รับประโยชน์จากการย้ายรหัสนั้นไปเป็นไฟล์แยกต่างหาก เราเตอร์ไฟล์แต่ละคนจะกลายเป็นแอพพลิเคมินิซึ่งมีโครงสร้างคล้ายกันมากกับapp หลัก

ในตัวอย่างข้างต้นรหัสสำหรับสุนัข /เส้นทางได้ถูกย้ายไปลงในไฟล์ของตัวเองดังนั้นจึงไม่ถ่วงขึ้นapp หลัก รหัสสำหรับ/ catsและ/ birdsจะมีโครงสร้างคล้ายกันในไฟล์ของตนเอง ด้วยการแยกรหัสนี้ออกเป็นสามแอปขนาดเล็กคุณสามารถทำงานกับตรรกะสำหรับแต่ละแอพแยกกันได้และไม่ต้องกังวลว่ามันจะส่งผลกระทบกับอีกสองแอปนี้อย่างไร

หากคุณมีรหัส (มิดเดิลแวร์) ที่เกี่ยวข้องกับทั้งสามเส้นทางคุณสามารถวางไว้ในแอพหลักก่อนการapp.use(...)โทร หากคุณมีรหัส (มิดเดิลแวร์) ที่เกี่ยวข้องกับหนึ่งในเส้นทางเหล่านั้นคุณสามารถวางไว้ในไฟล์สำหรับเส้นทางนั้นเท่านั้น


คุณไม่ควรต้องผ่านวัตถุของแอapp.use('/dogs', dogs)(app)พเนื่องจากคุณกำหนดเส้นทางไว้ที่นั่นนอกจากนี้ (และแก้ไขให้ฉันด้วยถ้าฉันทำผิด) ถ้าคุณทำเช่นนี้วัตถุแอปจะมีมิดเดิลแวร์ทั้งหมดที่วางไว้ก่อนหน้านี้ และเพิ่มมิดเดิลแวร์เพิ่มเติมจะถูกเพิ่มลงในวัตถุแอป หากคุณใช้route.get('/dogs', route)มันจะส่งผ่านมิดเดิลแวร์ไปยังวัตถุแอปเมื่อโต้ตอบกับเส้นทางที่กำหนดไว้ในเราเตอร์นั้นและหากขอบเขตของแอปอยู่นอกเส้นทางเราไม่สามารถเข้าถึงมิดเดิลแวร์นั้นได้
หิวมาก

1
app.use('/dogs', show)คุณไม่จำเป็นต้องผ่านการตรวจสอบเพื่อเส้นทางเพราะเส้นทางจะถูกส่งผ่านไปยังแอปด้วย วิธีนี้เป็นเส้นทางที่เป็นอิสระจากแอพและสามารถนำกลับมาใช้ใหม่ได้ในแอพ Express ใด ๆ Middleware วางไว้ที่ใดก็ได้ก่อนที่เส้นทางจะถูกใช้โดยเส้นทาง หากคุณวางมิดเดิลแวร์เหนือเส้นทางทั้งหมดใน app.js เส้นทางทั้งหมดจะใช้มิดเดิลแวร์นั้น หากคุณวางมิดเดิลแวร์ไว้ในไฟล์เส้นทาง (dogs.js) เฉพาะเส้นทางนั้นเท่านั้นที่จะใช้งาน หากคุณวางมิดเดิลแวร์หลังเส้นทาง GET ภายใน dogs.js เฉพาะเส้นทาง POST เท่านั้นที่จะใช้ (ตราบใดที่มันสิ้นสุดด้วยการตอบกลับ)
Nocturno

อ่าฉันไม่ดี ฉันหมายถึงใส่app.get('/dogs'dogs,)(app)เพราะคำถามเกี่ยวกับคุณสมบัติการรับของ app.get และ route.get คุณได้แสดงวิธีแยกเส้นทางเพื่อให้สามารถจัดการได้ แต่ Anacdote ของฉันจะไม่ถูกต้องถ้าเรากำลังพูดถึงapp.get? ถ้าฉันได้พีซีฉันจะแก้ไขความคิดเห็นข้างต้น
หิวมาก

2
แอพของฉันยังใช้งานได้เมื่อฉันใช้ express.Router () หรือ express () ฉันไม่เข้าใจความแตกต่าง :(
Ajay Suwalka

3
@Jay Suwalka ฉันไม่รู้ว่าฉันจะอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ฉันพูดไปแล้วได้อย่างไร เอกสารกล่าวว่า "วัตถุเราเตอร์เป็นตัวอย่างของมิดเดิลแวร์และเส้นทาง" ฉันชอบ @Jonathan Lonowski แสดงความคิดเห็นข้างต้น "A Routerไม่ได้.listen()สำหรับการร้องขอด้วยตัวเอง" นั่นอาจเป็นความแตกต่างหลัก
Nocturno

29

Express 4.0 มาพร้อมกับเราเตอร์ใหม่ ตามที่ระบุไว้ในเว็บไซต์:

คลาส express.Router สามารถใช้เพื่อสร้างตัวจัดการเส้นทางแบบแยกส่วนได้ อินสแตนซ์ Router เป็นมิดเดิลแวร์และระบบเส้นทางที่สมบูรณ์ ด้วยเหตุนี้จึงมักเรียกกันว่า "แอพขนาดเล็ก"

มีบทความที่ดีที่https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4ซึ่งอธิบายความแตกต่างและสิ่งที่สามารถทำได้กับเราเตอร์

เพื่อสรุป

ด้วยเราเตอร์คุณสามารถทำให้โค้ดของคุณเป็นโมดูลได้ง่ายขึ้น คุณสามารถใช้เราเตอร์เป็น:

  1. เส้นทางพื้นฐาน: บ้านเกี่ยวกับ
  2. จัดเส้นทาง Middleware เพื่อบันทึกการร้องขอไปยังคอนโซล
  3. กำหนดเส้นทางด้วยพารามิเตอร์
  4. เส้นทาง Middleware สำหรับพารามิเตอร์เพื่อตรวจสอบพารามิเตอร์เฉพาะ
  5. ตรวจสอบความถูกต้องของพารามิเตอร์ที่ส่งผ่านไปยังเส้นทางที่แน่นอน

บันทึก:

app.routerวัตถุซึ่งถูกถอดออกในเอ็กซ์เพรส 4 ได้ทำกลับมาในเอ็กซ์เพรส 5. ในรุ่นใหม่ก็เป็นเพียงการอ้างอิงถึงฐานเราเตอร์เอ็กซ์เพรส, แตกต่างจากในเอ็กซ์เพรส 3 ที่แอปมีการโหลดอย่างชัดเจน


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

ดังตัวอย่างข้างต้นเราสามารถเพิ่มวิธีการร้องขอ HTTP ที่แตกต่างกันภายใต้เส้นทาง


5

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

var express = require('express');
var parent = express();

และสำหรับแอปพลิเคชันหลักนี้เราจำเป็นต้องนำแอปพลิเคชันลูกมาด้วย แต่เนื่องจากแอปพลิเคชันลูกไม่ใช่แอปพลิเคชันที่แตกต่างกันโดยสิ้นเชิง (เนื่องจากพวกเขาทำงานในเทอมบริบทจาวาเดียวกัน) Express ให้วิธีการที่จะทำได้โดยใช้ฟังก์ชั่นเราเตอร์ของ Expresse และนี่คือสิ่งที่เราทำในไฟล์โมดูลย่อยแต่ละไฟล์ ช่วยให้เรียกโมดูลเด็กคนหนึ่งเช่นaboutme

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

โดยmodule.exportsเรากำลังทำให้โมดูลนี้พร้อมใช้งานสำหรับผู้อื่นเพื่อบริโภคและเนื่องจากเรามีสิ่งที่ทำให้เป็นโมดูลเราจำเป็นต้องทำให้ไฟล์โมดูลพร้อมใช้งานสำหรับแอ็พพลิเคชันหลักโดยใช้ฟังก์ชันที่โหนดต้องการเช่นเดียวกับโมดูลบุคคลที่สามอื่น ๆ อะไรแบบนี้

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

หลังจากที่เราทำให้โมดูลลูกนี้พร้อมใช้งานสำหรับผู้ปกครองเราจำเป็นต้องบอกแอปพลิเคชันหลักเมื่อใช้แอปพลิเคชันลูกนี้ ช่วยบอกว่าเมื่อผู้ใช้ฮิตเส้นทาง aboutme เราจำเป็นต้องใช้โปรแกรมเด็กเกี่ยวกับฉันจะจัดการกับการร้องขอและที่เราทำมันโดยใช้ Expresse ของการใช้วิธีการ

parent.use('/aboutme',  aboutme);

และในครั้งเดียวที่ไฟล์แม่มีลักษณะเช่นนี้

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

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


1
ไม่ควรเป็นเช่นนี้parent.use('/aboutme', child)?
Kees de Kooter

2

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


2

express.Router มีตัวเลือกมากมาย:

  • เปิดใช้งานการพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: /showเส้นทางไม่เหมือนกัน/Showพฤติกรรมนี้ถูกปิดใช้งานโดยค่าเริ่มต้น
  • โหมดเส้นทางที่เข้มงวด: /show/เส้นทางไปไม่เหมือนกัน/showพฤติกรรมนี้ถูกปิดใช้งานโดยค่าเริ่มต้น
  • เราสามารถเพิ่มมิดเดิลแวร์ที่เฉพาะเจาะจงไปยังเส้นทางที่เฉพาะเจาะจง

0

ในคำเดียวexpress.Routerสามารถทำสิ่งต่าง ๆ ได้มากขึ้นเมื่อเปรียบเทียบกับapp.get()เช่นมิดเดิลแวร์ยิ่งไปกว่านั้นคุณสามารถกำหนดวัตถุเราเตอร์อีกด้วยexpress.Router()

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