มีความแตกต่างที่เป็นประโยชน์ระหว่างapp.all('*', ... )
และapp.use('/', ...)
ใน Node.JS Express หรือไม่?
มีความแตกต่างที่เป็นประโยชน์ระหว่างapp.all('*', ... )
และapp.use('/', ...)
ใน Node.JS Express หรือไม่?
คำตอบ:
ในกรณีส่วนใหญ่พวกเขาจะทำงานได้เทียบเท่ากัน ความแตกต่างที่ใหญ่ที่สุดคือลำดับที่จะใช้มิดเดิลแวร์:
app.all()
ยึดติดกับเราเตอร์ของแอปพลิเคชันดังนั้นจึงใช้เมื่อใดก็ตามที่ถึงมิดเดิลแวร์ของ app.router (ซึ่งจัดการเส้นทางเมธอดทั้งหมด ... GET, POST ฯลฯ )ข้อสังเกต: app.router เลิกใช้งานแล้วใน Express 4.x
app.use()
ยึดติดกับสแต็กมิดเดิลแวร์หลักของแอปพลิเคชันดังนั้นจึงใช้ตามลำดับที่มิดเดิลแวร์ระบุ เช่นถ้าคุณใส่มันก่อนมันจะเป็นสิ่งแรกที่จะเรียกใช้ หากคุณวางไว้ล่าสุด (หลังเราเตอร์) ก็มักจะไม่ทำงานเลยโดยปกติแล้วหากคุณต้องการทำบางสิ่งทั่วโลกในทุกเส้นทาง app.use () เป็นตัวเลือกที่ดีกว่า นอกจากนี้ยังมีโอกาสน้อยที่จะเกิดข้อบกพร่องในอนาคตเนื่องจาก express 0.4 อาจจะทำให้เราเตอร์โดยปริยาย (หมายความว่าตำแหน่งของเราเตอร์ในมิดเดิลแวร์จะมีความสำคัญมากกว่าที่เป็นอยู่ในตอนนี้เนื่องจากในทางเทคนิคแล้วคุณไม่จำเป็นต้องใช้มันด้วยซ้ำ ตอนนี้)
next("route")
กับapp.all
แต่ใช้กับapp.use
.
app.useใช้ฟังก์ชันเรียกกลับเพียงฟังก์ชันเดียวและมีไว้สำหรับมิดเดิลแวร์ มิดเดิลแวร์มักจะไม่จัดการคำขอและการตอบกลับ (ในทางเทคนิคพวกเขาทำได้) เพียงแค่ประมวลผลข้อมูลอินพุตและส่งมอบให้กับตัวจัดการถัดไปในคิว
app.use([path], function)
app.allรับการโทรกลับหลายครั้งและมีไว้สำหรับการกำหนดเส้นทาง ด้วยการโทรกลับหลายครั้งคุณสามารถกรองคำขอและส่งการตอบกลับได้ อธิบายไว้ในFilters on express.js
app.all(path, [callback...], callback)
app.useจะเห็นว่า url ขึ้นต้นด้วยเส้นทางที่ระบุเท่านั้นหรือไม่
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.allจะตรงกับเส้นทางที่สมบูรณ์
app.all( "/product" , handler);
// will match /product
// won't match /product/cool <-- important
// won't match /product/foo <-- important
app.all( "/product/*" , handler);
// won't match /product <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo
app.use:
app.all:
ดูตัวอย่างโค้ด expressJs นี้:
var express = require('express');
var app = express();
app.use(function frontControllerMiddlewareExecuted(req, res, next){
console.log('(1) this frontControllerMiddlewareExecuted is executed');
next();
});
app.all('*', function(req, res, next){
console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
next();
});
app.all('/hello', function(req, res, next){
console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
next();
});
app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
next();
});
app.get('/hello', function(req, res){
console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
res.send('Hello World');
});
app.listen(80);
นี่คือบันทึกเมื่อเข้าถึงเส้นทาง '/ สวัสดี':
(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response
ด้วยapp.use()
พา ธ "mount" ถูกถอดออกและมองไม่เห็นฟังก์ชันมิดเดิลแวร์:
app.use('/static', express.static(__dirname + '/public'));
ฟังก์ชันมิดเดิลแวร์ที่ต่อเชื่อม ( express.static
) จะไม่ถูกเรียกใช้เว้นแต่จะreq.url
มีคำนำหน้านี้ ( /static
) ซึ่งจะถูกขีดฆ่าเมื่อเรียกใช้ฟังก์ชัน
ด้วยapp.all()
ไม่มีพฤติกรรมนั้น
ใช่app.all()
ถูกเรียกเมื่อมีการร้องขอ URI โดยเฉพาะด้วยวิธีการร้องขอประเภทใดก็ได้ (POST, GET, PUT หรือ DELETE)
ในทางกลับกันapp.use()
ใช้สำหรับมิดเดิลแวร์ใด ๆ ที่คุณอาจมีและจะเชื่อมต่อกับคำนำหน้าพา ธ และจะถูกเรียกเมื่อใดก็ตามที่มีการร้องขอ URI ภายใต้เส้นทางนั้น
นี่เป็นวิธีการใช้app.all & app.use
ความแตกต่างสองคำตอบทั้งหมดข้างต้นไม่ได้เป็นคำตอบ
fisrt one: app.all
ยอมรับ regex เป็นพารามิเตอร์ path app.use
ไม่ยอมรับนิพจน์ทั่วไป
คนที่สอง:
app.all(path,handler)
หรือapp[method](path,handler)
ของการจัดการpath
จะต้องเหมือนกันไปทั้งหมด path
นี่คือเส้นทางของแอป [วิธีการ] เสร็จสมบูรณ์
app.use(path,hanlder)
หากเส้นทางของการใช้งานเสร็จสมบูรณ์เส้นทางของแฮนเดอร์จะต้องเป็น '/' หากเส้นทางของการใช้เป็นจุดเริ่มต้นของเส้นทางที่สมบูรณ์เส้นทางตัวจัดการจะต้องเป็นส่วนที่เหลือของเส้นทางที่สมบูรณ์
app.use('/users', users);
//users.js: the handler will be called when matchs `/user/` path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
// others.js: the handler will be called when matchs `/users/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
app.all('/users', users);
//others.js: the handler wil be called when matchs `/`path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
//users.js: the handler will be called when matchs `/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
มีสองความแตกต่างหลักคือ
1. รูปแบบการจับคู่ (คำตอบที่ได้รับจากพาลานี)
2. จะไม่ทำงานภายในร่างกายทำงานของมิดเดิ้ลถูกเรียกใช้งานnext(route)
app.use
สิ่งนี้ระบุไว้ในลิงค์จากเอกสาร:
NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
ลิงก์: http://expressjs.com/en/guide/using-middleware.html
ผลการทำงานnext('route')
สามารถเห็นได้จากตัวอย่างต่อไปนี้:
app.get('/',
(req,res,next)=>{console.log("1");
next(route); //The code here skips ALL the following middlewares
}
(req,res,next)=>{next();}, //skipped
(req,res,next)=>{next();} //skipped
);
//Not skipped
app.get('/',function(req,res,next){console.log("2");next();});