ในเอกสารสำหรับ NodeJS express
โมดูลapp.use(...)
รหัสตัวอย่างมี
use
ฟังก์ชั่นคืออะไรและมันกำหนดไว้ที่ไหน?
ในเอกสารสำหรับ NodeJS express
โมดูลapp.use(...)
รหัสตัวอย่างมี
use
ฟังก์ชั่นคืออะไรและมันกำหนดไว้ที่ไหน?
คำตอบ:
วัตถุของแอปถูกสร้างตัวอย่างในการสร้างเซิร์ฟเวอร์ Express แต่ก็มีมิดเดิลแวร์สแต็คที่สามารถปรับแต่งในapp.configure()
(นี้จะเลิกตอนนี้ในรุ่น 4.x)
ในการตั้งค่ามิดเดิลแวร์ของคุณคุณสามารถเรียกใช้app.use(<specific_middleware_layer_here>)
สำหรับมิดเดิลแวร์เลเยอร์ทั้งหมดที่คุณต้องการเพิ่ม (สามารถเป็นแบบทั่วไปกับทุกเส้นทางหรือเรียกใช้เฉพาะเส้นทางที่เฉพาะเจาะจงที่เซิร์ฟเวอร์ของคุณจัดการ) และเพิ่มลงในมิดเดิ้ลมิดเดิลแวร์Expressของคุณ มิดเดิ้ลแวร์สามารถเพิ่มได้ทีละหนึ่งในการเรียกใช้หลายรายการuse
หรือแม้แต่ทั้งหมดในคราวเดียวด้วยการเรียกใช้เพียงครั้งเดียว ดูuse
เอกสารประกอบสำหรับรายละเอียดเพิ่มเติม
เพื่อให้ตัวอย่างสำหรับความเข้าใจแนวคิดของ Express Middleware นี่คือสิ่งที่มิดเดิลแวร์แอพของฉัน (app.stack) ดูเหมือนเมื่อบันทึกวัตถุแอปของฉันไปยังคอนโซลในฐานะ JSON:
stack:
[ { route: '', handle: [Function] },
{ route: '', handle: [Function: static] },
{ route: '', handle: [Function: bodyParser] },
{ route: '', handle: [Function: cookieParser] },
{ route: '', handle: [Function: session] },
{ route: '', handle: [Function: methodOverride] },
{ route: '', handle: [Function] },
{ route: '', handle: [Function] } ]
ในขณะที่คุณอาจจะสามารถที่จะอนุมานผมเรียกว่าapp.use(express.bodyParser())
, app.use(express.cookieParser())
ฯลฯ ซึ่งเพิ่ม 'ชั้น' เหล่านี้ด่วนมิดเดิลแวร์เพื่อสแต็คมิดเดิลแวร์ โปรดสังเกตว่าเส้นทางนั้นว่างเปล่าหมายความว่าเมื่อฉันเพิ่มเลเยอร์มิดเดิลแวร์เหล่านั้นฉันระบุว่าพวกเขาจะถูกทริกเกอร์ในเส้นทางใด ๆ หากฉันเพิ่มชั้นมิดเดิลแวร์ที่กำหนดเองที่เรียกเฉพาะบนเส้นทาง/user/:id
ที่จะสะท้อนเป็นสตริงในroute
ฟิลด์ของวัตถุชั้นมิดเดิลแวร์นั้นในการพิมพ์สแต็กด้านบน
แต่ละชั้นจะเพิ่มฟังก์ชั่นที่จัดการกับบางสิ่งบางอย่างเพื่อการไหลของคุณผ่านมิดเดิลแวร์
เช่นโดยการเพิ่มbodyParser
, คุณกำลังสร้างความมั่นใจจับเซิร์ฟเวอร์ของคุณร้องขอขาเข้าผ่านตัวกลางด่วน ดังนั้นตอนนี้แยกร่างกายของการร้องขอเข้ามาเป็นส่วนหนึ่งของขั้นตอนที่มิดเดิลแวร์ของคุณใช้เวลาเมื่อการจัดการการร้องขอขาเข้า - app.use(bodyParser)
ทั้งหมดเพราะคุณเรียกว่า
next()
โทรกลับแต่ละมิดเดิ้ลแวร์คาดว่าจะเรียกเพื่อผ่านการประมวลผลไปยังฟังก์ชันถัดไปในไพพ์ไลน์ ระบบสายงานการผลิต (อาร์กิวเมนต์แรกถึงapp.use()
) อนุญาตให้ไปป์ไลน์ตามสาขาขึ้นอยู่กับ URL
use
เป็นวิธีการกำหนดค่ามิดเดิลแวร์ที่ใช้โดยเส้นทางของวัตถุเซิร์ฟเวอร์ Express HTTP วิธีการกำหนดไว้เป็นส่วนหนึ่งของการเชื่อมต่อที่ Express จะขึ้นอยู่กับ
การปรับปรุงที่เริ่มต้นด้วยรุ่น 4.x ด่วนไม่ขึ้นอยู่กับการเชื่อมต่อ
ฟังก์ชั่นมิดเดิลแวร์ที่ก่อนหน้านี้รวมอยู่ใน Express นั้นอยู่ในโมดูลแยกต่างหาก ดูรายชื่อของฟังก์ชั่นมิดเดิลแวร์
app.use(function(){ var object = new SomeConstructor; next(); })
แต่ละapp.use (มิดเดิลแวร์)จะถูกเรียกทุกครั้งที่มีการส่งคำขอไปยังเซิร์ฟเวอร์
app.use () ใช้เพื่อ Mounts ฟังก์ชั่นมิดเดิลแวร์หรือเมาท์กับเส้นทางที่ระบุฟังก์ชั่นมิดเดิลแวร์จะถูกดำเนินการเมื่อเส้นทางฐานตรงกัน
ตัวอย่างเช่น: หากคุณใช้ app.use () ใน indexRouter.js เช่นนี้:
//indexRouter.js
var adsRouter = require('./adsRouter.js');
module.exports = function(app) {
app.use('/ads', adsRouter);
}
ในโค้ดข้างต้น app.use () ติดเส้นทางบน '/ ads' ไปที่ adsRouter.js
ตอนนี้อยู่ใน adsRouter.js
// adsRouter.js
var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;
ใน adsRouter.js เส้นทางจะเป็นเช่นนี้สำหรับ ads- '/ ads / show' แล้วมันจะทำงานตาม controllerIndex.ads.showAd ()
app.use ([path], callback, [callback]): เราสามารถเพิ่มการติดต่อกลับได้ในแบบเดียวกัน
app.use('/test', function(req, res, next) {
// write your callback code here.
});
app.use ()ทำหน้าที่เป็นตัวกลางในแอปด่วน ต่างจากapp.get ()และapp.post ()หรือมากกว่านั้นจริง ๆ แล้วคุณสามารถใช้app.use ()โดยไม่ต้องระบุ URL คำขอ ในกรณีเช่นนี้มันทำอะไรมันจะถูกเรียกใช้งานทุกครั้งไม่ว่า URL ใดที่ถูกตี
app.use () ทำงานเช่นนั้น:
ซึ่งง่ายมาก
และจากนั้นด่วนจะทำสิ่งที่เหลือเช่นเส้นทาง
app.use(function middleware1(req, res, next){
// middleware1 logic
}, function middleware1(req, res, next){
// middleware2 logic
}, ... middlewareN);
app.useเป็นวิธีการลงทะเบียนมิดเดิลแวร์หรือเชนของมิดเดิลแวร์ (หรือมิดเดิลแวร์หลายตัว) ก่อนที่จะดำเนินการตรรกะเส้นทางปลายทางใด ๆ หรือตรรกะเส้นทางตัวกลางขึ้นอยู่กับคำสั่งของลำดับการลงทะเบียนมิดเดิลแวร์
มิดเดิ้ล:รูปแบบห่วงโซ่ของฟังก์ชั่น / มิดเดิ้ลฟังก์ชั่นที่มี3 พารามิเตอร์ req, ความละเอียดและต่อไป next คือ callback ซึ่งอ้างถึง middleware-function ต่อไปใน chain และในกรณีที่ middleware-function ของ chain ชี้ไปที่ next-middleware-function ของ middlerare-chain ที่ลงทะเบียนถัดไป
โดยด่วนหากเรานำเข้าด่วนจาก "ด่วน" และใช้แอพ = express (); จากนั้นแอปที่มีฟังก์ชั่นการใช้งานด่วนทั้งหมด
ถ้าเราใช้ app.use ()
ด้วยฟังก์ชั่นโมดูล / มิดเดิลแวร์ใด ๆ ที่จะใช้ในโครงการด่วนทั้งหมด
app.use
ฟังก์ชั่นต้องใช้มิดเดิลแวร์ ตัวอย่างเช่น:
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
ตัวอย่างนี้แสดงฟังก์ชั่นมิดเดิลแวร์ที่ติดตั้งใน/user/:id
พา ธ ฟังก์ชันนี้ถูกเรียกใช้งานสำหรับคำขอ HTTP ประเภทใดก็ได้ใน/user/:id
พา ธ
มันคล้ายกับ REST Web Server เพียงใช้แตกต่างกัน/xx
เพื่อแสดงการกระทำที่แตกต่างกัน
use
สามารถทำได้ ฉันแค่ต้องรู้ว่านั่นคือสิ่งที่มันเป็น (และความรู้ด้านบริบทใด ๆ ที่จะรู้วิธีการวิจัยเพิ่มเติมด้วยตนเอง)
app.useเป็น woks เป็นมิดเดิลแวร์สำหรับคำขอแอป วากยสัมพันธ์
app.use('pass request format',function which contain request response onject)
ตัวอย่าง
app.use('/',funtion(req,res){
console.log(all request pass through it);
// here u can check your authentication and other activities.
})
นอกจากนี้คุณสามารถใช้มันในกรณีที่กำหนดเส้นทางคำขอของคุณ
app.use('/', roting_object);
Middleware เป็นคำทั่วไปสำหรับซอฟต์แวร์ที่ให้บริการ "กาวด้วยกัน" ดังนั้น app.use เป็นวิธีการกำหนดค่ามิดเดิลแวร์ตัวอย่างเช่น: การแยกวิเคราะห์และจัดการเนื้อความของการร้องขอ: app.use (bodyParser.urlencoded (ขยาย: จริง )}); app.use (bodyParser.json ()); มีมิดเดิ้ลมากมายที่คุณสามารถใช้ในแอปพลิเคชันด่วนของคุณเพียงแค่อ่านเอกสาร: http://expressjs.com/en/guide/using-middleware.html
app.use ใช้มิดเดิลแวร์ที่ระบุกับมิดเดิลแวร์ของแอพหลัก เมื่อติดมิดเดิลแวร์เข้ากับสแต็กหลักของแอปลำดับของสิ่งที่แนบมานั้น หากคุณแนบมิดเดิลแวร์ A ก่อนหน้ามิดเดิลแวร์ B มิดเดิลแวร์ A จะดำเนินการก่อนเสมอ คุณสามารถระบุพา ธ ที่มิดเดิลแวร์เฉพาะใช้ได้ ในตัวอย่างด้านล่าง“ สวัสดีโลก” จะถูกบันทึกไว้เสมอก่อน“ สุขสันต์วันหยุด”
const express = require('express')
const app = express()
app.use(function(req, res, next) {
console.log('hello world')
next()
})
app.use(function(req, res, next) {
console.log('happy holidays')
next()
})
ช่วยให้คุณสามารถใช้ตัวกลางใด ๆ ( อ่านรายละเอียดเพิ่มเติม ) เช่นbody_parser
, CORS
ฯลฯ Middleware สามารถทำการเปลี่ยนแปลงrequest
และresponse
วัตถุ นอกจากนี้ยังสามารถรันโค้ดบางส่วนได้
คุณสามารถสร้างฟังก์ชั่นมิดเดิลแวร์ของคุณเองเช่น
app.use( function(req, res, next) {
// your code
next();
})
มันมีสามพารามิเตอร์req
, res
, next
นอกจากนี้คุณยังสามารถใช้สำหรับการตรวจสอบและการตรวจสอบของ params ป้อนข้อมูลเพื่อรักษาความสะอาดการควบคุมของคุณ
next()
ใช้สำหรับไปที่มิดเดิลแวร์หรือเส้นทางถัดไป
คุณสามารถส่งคำตอบจากมิดเดิลแวร์
ผูกมิดเดิลแวร์ระดับแอปพลิเคชันกับอินสแตนซ์ของวัตถุแอปโดยใช้ฟังก์ชัน app.use () และ app.METHOD () โดยที่วิธีการเป็นวิธี HTTP ของการร้องขอที่ฟังก์ชันมิดเดิลแวร์จัดการ (เช่น GET, PUT หรือ POST) เป็นตัวพิมพ์เล็ก
ใน app.use สั้น ๆ () รองรับคำขอทุกประเภท [เช่น: รับโพสต์ ... ] ดังนั้นส่วนใหญ่จะใช้เพื่อตั้งค่า middelware หรือสามารถใช้สำหรับเมื่อเส้นทางและฟังก์ชั่นแยกกัน
ตัวอย่าง:
app.use("/test",functionName)
และ functionName ตั้งอยู่ในไฟล์ที่แตกต่างกัน
app.use()
เป็นวิธีการมิดเดิลแวร์
วิธีการมิดเดิลแวร์เหมือนกับตัวดักจับใน java วิธีนี้จะดำเนินการสำหรับคำขอทั้งหมดเสมอ
วัตถุประสงค์และการใช้มิดเดิลแวร์: -
app.use
สร้างขึ้นโดย express (กรอบงานมิดเดิลแวร์ของ nodejs)
app.use ใช้เพื่อรันเคียวรีเฉพาะที่กระบวนการกระบวนการ
server.js (โหนด)
var app = require ('express');
ดังนั้นฟังก์ชั่น app.use โดยทั่วไปเรียกว่าทุกครั้งเมื่อเซิร์ฟเวอร์ขึ้น
app.use(bodyparser.json())
app.use เป็นมิดเดิลแวร์ระดับแอปพลิเคชัน
ผูกมิดเดิลแวร์ระดับแอปพลิเคชันกับอินสแตนซ์ของวัตถุแอปโดยใช้ฟังก์ชัน app.use () และ app.METHOD () โดยที่วิธีการเป็นวิธี HTTP ของการร้องขอที่ฟังก์ชันมิดเดิลแวร์จัดการ (เช่น GET, PUT หรือ POST) เป็นตัวพิมพ์เล็ก
คุณสามารถใช้เพื่อตรวจสอบคำขอทั้งหมดตัวอย่างเช่นคุณต้องการตรวจสอบโทเค็น / โทเค็นการเข้าถึงที่คุณต้องการเขียนมิดเดิลแวร์โดยใช้ app.use เพื่อตรวจสอบโทเค็นในคำขอ
ตัวอย่างนี้แสดงฟังก์ชันมิดเดิลแวร์ที่ไม่มีพา ธ การเมาต์ ฟังก์ชั่นจะดำเนินการทุกครั้งที่แอปได้รับคำขอ
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
การอ้างอิงจากhttps://expressjs.com/th/guide/using-middleware.html
app.use (พา ธ , มิดเดิลแวร์)ถูกใช้เพื่อเรียกใช้ฟังก์ชันมิดเดิลแวร์ที่ต้องถูกเรียกก่อนที่เส้นทางจะถูกตีสำหรับเส้นทางที่สอดคล้องกัน สามารถเรียกใช้ฟังก์ชั่นมิดเดิลแวร์หลายรายการผ่านแอพ
app.use ( '/ เรียก', enforceAuthentication) -> enforceAuthentication มิดเดิลแวร์ Fn จะถูกเรียกว่าเมื่อมีการร้องขอที่เริ่มต้นด้วย '/ เรียก'จะได้รับ มันอาจเป็น / fetch / users , / fetch / ids / {id} , เป็นต้น
มิดเดิลแวร์บางฟังก์ชันอาจต้องเรียกใช้โดยไม่คำนึงถึงคำขอ สำหรับกรณีดังกล่าวจะไม่มีการระบุเส้นทางและเนื่องจากค่าเริ่มต้นของเส้นทางเป็น/และทุกคำขอเริ่มต้นด้วย/ฟังก์ชันมิดเดิลแวร์นี้จะถูกเรียกใช้สำหรับคำขอทั้งหมด
app.use (() => {// เริ่มต้นบริการทั่วไป})
next () fn จำเป็นต้องถูกเรียกภายในแต่ละมิดเดิลแวร์ฟังก์ชั่นเมื่อมีการส่งผ่านฟังก์ชั่นมิดเดิลแวร์หลายอันไปยังapp.useมิฉะนั้นฟังก์ชันมิดเดิลแวร์ถัดไปจะไม่ถูกเรียก
การอ้างอิง: http://expressjs.com/en/api.html#app.use
หมายเหตุ: เอกสารบอกว่าเราสามารถข้ามฟังก์ชั่นมิดเดิลแวร์ที่ติดตามปัจจุบันโดยการเรียกถัดไป ('เส้นทาง')ภายในฟังก์ชั่นมิดเดิลแวร์ปัจจุบัน แต่เทคนิคนี้ใช้ไม่ได้สำหรับฉันภายในแอพใช้งานแต่ทำงานกับแอพได้เช่นด้านล่าง . ดังนั้นจึงเรียกใช้ fn1 และ fn2 แต่ไม่ใช่ fn3
app.get('/fetch', function fn1(req, res, next) {
console.log("First middleware function called");
next();
},
function fn2(req, res, next) {
console.log("Second middleware function called");
next("route");
},
function fn3(req, res, next) {
console.log("Third middleware function will not be called");
next();
})