node.js - شرح - express vpn




Express-js wildcard routing لتغطية كل شيء ضمن المسار بما في ذلك (4)

أحاول أن يكون هناك طريق واحد يغطي كل شيء تحت /foo بما في ذلك /foo نفسه. لقد حاولت استخدام /foo* والتي تعمل لكل شيء ما عدا أنها لا تتطابق مع /foo . رصد:

var express = require("express"),
    app = express.createServer();

app.get("/foo*", function(req, res, next){
  res.write("Foo*\n");
  next();
});

app.get("/foo", function(req, res){
  res.end("Foo\n");
});

app.get("/foo/bar", function(req, res){
  res.end("Foo Bar\n");
});

app.listen(3000);

المخرجات:

$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar

ما هي خياراتي؟ أفضل ما جئت به هو توجيه /fo* وهو بالطبع ليس مثاليًا لأنه سيطابق كثيرًا.


أعتقد أنه سيكون عليك الحصول على مسارين. إذا نظرت إلى الخط 331 من موجه الاتصال ، فسيتم استبدال * في المسار بـ. + بحيث يتطابق مع حرف واحد أو أكثر.

https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js

إذا كان لديك مساران يؤديان نفس الإجراء ، فيمكنك القيام بما يلي للحفاظ عليه DRY .

var express = require("express"),
    app = express.createServer();

function fooRoute(req, res, next) {
  res.end("Foo Route\n");
}

app.get("/foo*", fooRoute);
app.get("/foo", fooRoute);

app.listen(3000);

بالإضافة إلى الإجابات الأخرى ، يمكنك أيضًا استخدام الدالة app.all() لتعيين جميع طرق http ( POST ، GET ، الخ) التي ستمكنك من متابعة مبدأ DRY أكثر.

بدلا من الحاجة للكتابة:

app.get('/foo', /* function */);

// and this

app.post('/foo', /* same function used here*/);

يمكنك ببساطة القيام بذلك:

app.all('/foo', /* function */); 

والتي سيتم استدعائها لكل من app.get('/foo') و app.post('/foo') .

إذا كنت تريد تغطية جميع الطرق لجميع المسارات ، فيمكنك القيام بذلك:

app.all('*', /* function */);

عندما أقول كل الطرق ، أعني كل شيء . كنت أستخدم وحدة تسمى "method-override" ، والتي سمحت لي باستخدام أساليب إضافية مثل PUT و DELETE ، وغطت الدالة app.all() هذه الطلبات أيضًا!

app.all('*', /* function */);

 ^
 |
this should cover all of these
                           |
                           v

app.get('*', /* function */);

app.post('*', /* function */);

app.put('*', /* function */);

app.delete('*', /* function */);

...

ابحث عن app.all في وثائق Express 4 لقراءة كل شيء عن app.all()


تمت الآن إزالة جهاز التوجيه الاتصال ( https://github.com/senchalabs/connect/issues/262 ) ، المؤلف يقول أنه يجب عليك استخدام إطار على أعلى من الاتصال (مثل اكسبرس) للتوجيه.

يعامل Express حاليًا app.get("/foo*") كـ app.get(/\/foo(.*)/) ، مما يلغي الحاجة إلى مسارين منفصلين. يتناقض هذا مع الإجابة السابقة (بالإشارة إلى جهاز التوجيه الذي تم إزالته الآن) والذي ينص على استبدال " * في مسار بـ .+ ".

تحديث: Express يستخدم الآن الوحدة النمطية "المسار إلى regexp" (منذ Express 4.0.0) الذي يحافظ على نفس السلوك في الإصدار المشار إليه حالياً. من غير الواضح لي ما إذا كانت النسخة الأخيرة من تلك الوحدة تحافظ على السلوك ، لكن في الوقت الحالي تقف هذه الإجابة.


في الصفيف ، يمكنك أيضًا استخدام المتغيرات التي تمر إلى req.params:

app.get(["/:foo", "/:foo/:bar"], /* function */);




express