NodeJS / Express:“ app.use” คืออะไร?


332

ในเอกสารสำหรับ NodeJS expressโมดูลapp.use(...)รหัสตัวอย่างมี

useฟังก์ชั่นคืออะไรและมันกำหนดไว้ที่ไหน?


5
เป็นไปได้ซ้ำ: stackoverflow.com/questions/7337572/…
Alexander Bird

คำถามประเภทนี้สามารถตอบได้โดยการอ่านเอกสาร
มีนา

47
เอกสารเป็นความลับเล็กน้อยสำหรับผู้เริ่มต้น
KansaiRobot

6
สำเนาที่เป็นไปได้ข้างต้นคือการอ้างอิงซึ่งกันและกัน
Afrig Aminuddin

1
เอกสารไม่ชัดเจนอย่างสมบูรณ์
Tessaracter

คำตอบ:


370

วัตถุของแอปถูกสร้างตัวอย่างในการสร้างเซิร์ฟเวอร์ 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)ทั้งหมดเพราะคุณเรียกว่า


116
ขอบคุณ. มันจะเป็นเรื่องยากสำหรับคนด่วนที่จะอธิบายเรื่องนี้ในเอกสาร API ของพวกเขา?
ericsoco

4
ดังนั้นคุณกำลังบอกว่าเมื่อได้รับการร้องขอข้อมูลจะถูกส่งผ่านตัวแยกวิเคราะห์เหล่านั้นก่อนที่จะกดปุ่มบริการจริง ตัวอย่างเช่น: คำขอที่ถูกต้อง -> การรับรองความถูกต้อง -> ProcessesRequest-> ServResponse USEจะควบคุมขั้นตอนเหล่านั้นตามลำดับเฉพาะและไม่ดำเนินการขนานกันใช่หรือไม่
Adam Hess

2
app.use () คือการฉีดการทำงานจริงหรือไม่
Kevin C.

8
ฟังก์ชั่นที่ถูกส่งไปยัง app.use ถูกเรียกเมื่อใด หลังจากสร้างเซิร์ฟเวอร์ด่วนหรือสำหรับทุกคำขอ
Timo Huovinen

5
@KevinC ไม่มันไม่ใช่การพึ่งพาการฉีด มันเป็นสถาปัตยกรรมปลั๊กอิน โดยทั่วไปแล้วสถาปัตยกรรมประเภทนี้เรียกว่าระบบการกรอง / การกรองท่อ / ท่อและตัวกรอง ใน Express ไพพ์คือการnext()โทรกลับแต่ละมิดเดิ้ลแวร์คาดว่าจะเรียกเพื่อผ่านการประมวลผลไปยังฟังก์ชันถัดไปในไพพ์ไลน์ ระบบสายงานการผลิต (อาร์กิวเมนต์แรกถึงapp.use()) อนุญาตให้ไปป์ไลน์ตามสาขาขึ้นอยู่กับ URL
slebetman

50

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

การปรับปรุงที่เริ่มต้นด้วยรุ่น 4.x ด่วนไม่ขึ้นอยู่กับการเชื่อมต่อ

ฟังก์ชั่นมิดเดิลแวร์ที่ก่อนหน้านี้รวมอยู่ใน Express นั้นอยู่ในโมดูลแยกต่างหาก ดูรายชื่อของฟังก์ชั่นมิดเดิลแวร์


3
และเอกสารออนไลน์อยู่ที่นี่: senchalabs.org/connect/proto.html#app.use
Alexander Bird

มันจะมีประสิทธิภาพไหมถ้า Node middleware สร้างวัตถุขึ้นมา? นี่หมายความว่าทุกครั้งที่มีการร้องขอมิดเดิลแวร์นั้นจะสร้างวัตถุใหม่หรือไม่ วัตถุเก่าถูกทิ้งหรือไม่? ตัวอย่างเช่นapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkai เป็นเรื่องดีที่จะสร้างอินสแตนซ์ของวัตถุในทุกคำขอ พวกเขาจะได้รับการเก็บขยะตราบใดที่คุณไม่ได้เก็บการอ้างอิงไปยังวัตถุที่อยู่นอกขอบเขตของตัวจัดการคำขอของคุณ
jeff_mcmahan

1
@AlexanderBird ขอบคุณสำหรับการเชื่อมโยง (อันที่หนึ่งถูกทำลายในขณะนี้แม้ว่า) สำหรับการบันทึกเพียงแค่จุดเริ่มต้นของ doc ในลิงค์ที่ 2 บอกว่า "ใช้ประโยชน์จากการจัดการมิดเดิลแวร์ที่กำหนดให้กับเส้นทางที่กำหนดเริ่มต้นที่ /" เส้นทาง "นี้เป็นจุดยึดสำหรับมิดเดิลแวร์เมื่อได้รับค่าอื่นที่ไม่ใช่ / มิดเดิลแวร์จะมีผลก็ต่อเมื่อเซกเมนต์นั้นมีอยู่ในชื่อพา ธ ของคำขอตัวอย่างเช่นถ้าเราจะเมาท์ฟังก์ชั่นที่ / admin มันจะถูกเรียกใช้ใน / admin และ / admin / การตั้งค่าอย่างไรก็ตามจะไม่ถูกเรียกใช้สำหรับ / หรือหรือโพสต์ " Simple :)
Adrien เป็น

40

แต่ละapp.use (มิดเดิลแวร์)จะถูกเรียกทุกครั้งที่มีการส่งคำขอไปยังเซิร์ฟเวอร์


7
คำตอบประโยคเดียวของคุณเข้าใจได้ง่ายและเป็นประโยชน์มากกว่าคำอธิบายหลายย่อหน้าอื่น ๆ
stackedAndOvered

16

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.

    });

ฉันใช้ "แผนที่" แทน "เมานท์" เข้าใจง่ายกว่า
Jeb50

13

app.use ()ทำหน้าที่เป็นตัวกลางในแอปด่วน ต่างจากapp.get ()และapp.post ()หรือมากกว่านั้นจริง ๆ แล้วคุณสามารถใช้app.use ()โดยไม่ต้องระบุ URL คำขอ ในกรณีเช่นนี้มันทำอะไรมันจะถูกเรียกใช้งานทุกครั้งไม่ว่า URL ใดที่ถูกตี


7

app.use () ทำงานเช่นนั้น:

  1. ร้องขอกิจกรรมที่ทริกเกอร์บนอินสแตนซ์ของเซิร์ฟเวอร์ http http
  2. express ทำการจัดการภายในด้วยวัตถุ req
  3. นี่คือเมื่อ express เริ่มทำสิ่งที่คุณระบุด้วย app.use

ซึ่งง่ายมาก

และจากนั้นด่วนจะทำสิ่งที่เหลือเช่นเส้นทาง


6
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 ที่ลงทะเบียนถัดไป


1
ทำงานเหมือนจับใจ !!
Anmol Rai

3

โดยด่วนหากเรานำเข้าด่วนจาก "ด่วน" และใช้แอพ = express (); จากนั้นแอปที่มีฟังก์ชั่นการใช้งานด่วนทั้งหมด

ถ้าเราใช้ app.use ()

ด้วยฟังก์ชั่นโมดูล / มิดเดิลแวร์ใด ๆ ที่จะใช้ในโครงการด่วนทั้งหมด


3

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สามารถทำได้ ฉันแค่ต้องรู้ว่านั่นคือสิ่งที่มันเป็น (และความรู้ด้านบริบทใด ๆ ที่จะรู้วิธีการวิจัยเพิ่มเติมด้วยตนเอง)
Alexander Bird

3

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);

2

Middleware เป็นคำทั่วไปสำหรับซอฟต์แวร์ที่ให้บริการ "กาวด้วยกัน" ดังนั้น app.use เป็นวิธีการกำหนดค่ามิดเดิลแวร์ตัวอย่างเช่น: การแยกวิเคราะห์และจัดการเนื้อความของการร้องขอ: app.use (bodyParser.urlencoded (ขยาย: จริง )}); app.use (bodyParser.json ()); มีมิดเดิ้ลมากมายที่คุณสามารถใช้ในแอปพลิเคชันด่วนของคุณเพียงแค่อ่านเอกสาร: http://expressjs.com/en/guide/using-middleware.html


2

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()
})

2

ช่วยให้คุณสามารถใช้ตัวกลางใด ๆ ( อ่านรายละเอียดเพิ่มเติม ) เช่นbody_parser, CORSฯลฯ Middleware สามารถทำการเปลี่ยนแปลงrequestและresponseวัตถุ นอกจากนี้ยังสามารถรันโค้ดบางส่วนได้


ขอบคุณสำหรับคำตอบ แต่ฉันเชื่อว่าข้อมูลทั้งหมดนั้นได้รับการบันทึกไว้แล้วในคำตอบอื่น ๆ
Alexander Bird

2

คุณสามารถสร้างฟังก์ชั่นมิดเดิลแวร์ของคุณเองเช่น

app.use( function(req, res, next) {
  // your code 
  next();
})

มันมีสามพารามิเตอร์req, res, next
นอกจากนี้คุณยังสามารถใช้สำหรับการตรวจสอบและการตรวจสอบของ params ป้อนข้อมูลเพื่อรักษาความสะอาดการควบคุมของคุณ

next()ใช้สำหรับไปที่มิดเดิลแวร์หรือเส้นทางถัดไป
คุณสามารถส่งคำตอบจากมิดเดิลแวร์


1

ผูกมิดเดิลแวร์ระดับแอปพลิเคชันกับอินสแตนซ์ของวัตถุแอปโดยใช้ฟังก์ชัน app.use () และ app.METHOD () โดยที่วิธีการเป็นวิธี HTTP ของการร้องขอที่ฟังก์ชันมิดเดิลแวร์จัดการ (เช่น GET, PUT หรือ POST) เป็นตัวพิมพ์เล็ก


1

ใน app.use สั้น ๆ () รองรับคำขอทุกประเภท [เช่น: รับโพสต์ ... ] ดังนั้นส่วนใหญ่จะใช้เพื่อตั้งค่า middelware หรือสามารถใช้สำหรับเมื่อเส้นทางและฟังก์ชั่นแยกกัน

ตัวอย่าง:

app.use("/test",functionName)

และ functionName ตั้งอยู่ในไฟล์ที่แตกต่างกัน


ขอบคุณสำหรับคำตอบ แต่ฉันเชื่อว่าข้อมูลทั้งหมดนั้นถูกบันทึกไว้ในคำตอบอื่นแล้ว
Alexander Bird

1

app.use() เป็นวิธีการมิดเดิลแวร์

วิธีการมิดเดิลแวร์เหมือนกับตัวดักจับใน java วิธีนี้จะดำเนินการสำหรับคำขอทั้งหมดเสมอ

วัตถุประสงค์และการใช้มิดเดิลแวร์: -

  1. เพื่อตรวจสอบว่าเซสชั่นหมดอายุหรือไม่
  2. สำหรับการตรวจสอบผู้ใช้และการอนุญาต
  3. ตรวจสอบคุกกี้ (วันหมดอายุ)
  4. แยกวิเคราะห์ข้อมูลก่อนตอบกลับ

Middleware เป็นฟังก์ชันที่ส่งผ่านไปยัง app.use ()
NattyC

1

app.use
สร้างขึ้นโดย express (กรอบงานมิดเดิลแวร์ของ nodejs)
app.use ใช้เพื่อรันเคียวรีเฉพาะที่กระบวนการกระบวนการ
server.js (โหนด)
var app = require ('express'); ดังนั้นฟังก์ชั่น app.use โดยทั่วไปเรียกว่าทุกครั้งเมื่อเซิร์ฟเวอร์ขึ้น
app.use(bodyparser.json())


0

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 () ไม่ใช่มิดเดิลแวร์ Middleware เป็นฟังก์ชันที่ส่งผ่านไปยัง app.use ()
NattyC

0

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