express.js - ตัวจัดการเส้นทางเดียวสำหรับหลายเส้นทางในบรรทัดเดียว


111

มีวิธีทำสิ่งนี้ในการเรียกใช้ฟังก์ชันเดียวหรือไม่?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

สิ่งที่ต้องการ:

app.get("/", "/blabla", "/blablablabla", todo );

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

ใครทราบวิธีการทำเช่นนี้


2
คุณควรจะสามารถเขียนนิพจน์ทั่วไปที่ตรงกับเส้นทางทั้งหมดที่คุณต้องการกำหนดเส้นทางไปยังสิ่งที่ต้องทำและใช้นิพจน์ทั่วไปเป็นจุดสิ้นสุดของคุณ มันอาจจะดูยุ่งเหยิง แต่ก็ใช้ได้ผล ฉันไม่ได้โพสต์สิ่งนี้เป็นคำตอบเพราะฉันไม่แน่ใจว่านิพจน์ทั่วไปจะเป็นอย่างไรและนี่เป็นการผลักดันไปสู่ทิศทางนั้นมากกว่า มีการกล่าวถึงการใช้นิพจน์ทั่วไปในเอกสารที่นี่: expressjs.com/api.html#app.VERB
Nick Mitchinson

ฉันไม่มีประสบการณ์กับ regex ใน JS ... ไม่ดีลองดูสิ ... แต่ยินดีต้อนรับตัวเลือกอื่น ๆ !
Aronis Mariano

1
ฉันเองก็ไม่มีอะไรมากซึ่งเป็นเหตุผลว่าทำไมฉันไม่เพียง แต่ให้มันกับคุณ แต่ความเข้าใจของฉันคือการแสดงออกปกตินั้นค่อนข้างเป็นสากล Express ควรแยกวิเคราะห์นิพจน์ของคุณให้เหมือนกับภาษาอื่น ๆ
Nick Mitchinson

1
สำนวนปกติมีพลังมากและคุ้มค่ากับการเรียนรู้ นี่คือวิธีแก้ปัญหา: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- พิมพ์ ',' text / plain ') .send ("Matched:'" + matched + "'");}); สองสิ่ง: 1. regex เริ่มต้นและลงท้ายด้วย a / ดังนั้นใด ๆ / ตัวอักษรจะต้องถูกหลีกเลี่ยง 2. ^ char ตรงกับจุดเริ่มต้นของสตริงโดย $ char จะตรงกับจุดสิ้นสุดของสตริง หากไม่มีพวกเขาการแข่งขันจะประสบความสำเร็จแม้จะมีอักขระพิเศษที่จุดเริ่มต้นหรือจุดสิ้นสุดของเส้นทางนั่นคือ / x / blablaxxx
John Deighan

คำตอบ:


134

ฉันเจอคำถามนี้ในขณะที่กำลังมองหาฟังก์ชันการทำงานเดียวกัน

@ Jonathan Ong กล่าวไว้ในความคิดเห็นข้างต้นว่าการใช้อาร์เรย์สำหรับพา ธ นั้นเลิกใช้แล้ว แต่มีการอธิบายไว้อย่างชัดเจนใน Express 4 และทำงานใน Express 3.x นี่คือตัวอย่างของสิ่งที่ควรลอง:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

จากภายในrequestวัตถุด้วยเส้นทาง/hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

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

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

แก้ไข: โปรดดูคำตอบ @ c24w ของด้านล่าง

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


58
app.get('/:var(bla|blabla)?', todo)

:varตั้งค่าreq.paramที่คุณไม่ได้ใช้ ใช้เฉพาะในกรณีนี้เพื่อตั้งค่านิพจน์ทั่วไป

(bla|blabla)ชุด regex จับคู่เพื่อให้ตรงกับสายและblablablah

?ทำให้ regex ทั้งหมดเป็นทางเลือกดังนั้นจึงตรงกัน/เช่นกัน


1
/bla(bla)?ยังใช้งานได้ แต่พารามิเตอร์ใด ๆ หลังจากนั้นไม่ได้รับการเติมข้อมูลอย่างถูกต้อง (เช่น/bla(bla)?/:valueไม่ได้เติมข้อมูลreq.params.value) ใครทราบสาเหตุ?
joscarsson

หากคุณใช้ Express คุณสามารถใช้งานได้req.params.varแต่คุณต้องแน่ใจว่าคุณได้reqผ่านฟังก์ชั่นนี้แล้ว
Matt The Ninja

51

คุณสามารถส่งผ่านอาร์เรย์ของเส้นทางได้เช่นเดียวกับที่คุณกล่าวถึงและใช้งานได้ดี:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

28
อะไรคือสิ่งทดแทนสำหรับสิ่งนี้ที่เลิกใช้งาน?
brandonscript

5
@JonathanOng คุณบอกว่านี่เลิกใช้แล้วรีมัสกำลังถามว่ามีอะไรมาทดแทน คุณช่วยตอบคำถามของเขา / เธอได้ไหม
nbro

router.route (['/ mailer / out / system', '/ mailer / out / payment']) ทำงานได้ดีใน express 4 ไม่มีคำเตือนการเลิกใช้งาน
danday74

2
@JonathanOng ดูเอกสาร Express v4 ปัจจุบันโดยใช้อาร์เรย์ดูเหมือนจะไม่เลิกใช้งาน
Jason Axelson

33

เพียงเพื่ออธิบายรายละเอียดเกี่ยวกับคำตอบของ Kevinนี่คือจากเอกสาร 4.x :

เส้นทางที่เรียกใช้ฟังก์ชันมิดเดิลแวร์ สามารถเป็น:

  • สตริงที่แสดงเส้นทาง
  • รูปแบบเส้นทาง
  • รูปแบบนิพจน์ทั่วไปเพื่อจับคู่เส้นทาง
  • อาร์เรย์ของชุดค่าผสมใด ๆ ข้างต้น

มีตัวอย่างบางส่วนได้แก่ :

นี้จะตรงกับเส้นทางที่เริ่มต้นด้วย/abcd, /xyza, /lmnและ/pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});


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