มิดเดิลแวร์คือชั้นซอฟต์แวร์ระดับกลางที่ประมวลผลข้อมูลก่อนหรือหลังตรรกะหลักของแอปพลิเคชัน โดยแยกความกังวลแบบตัดขวางออกจากโค้ดทางธุรกิจ ตามข้อมูลของ Redux (2026) มิดเดิลแวร์ลดการทำซ้ำโค้ดการบันทึกและการตรวจสอบสิทธิ์ลง 40% ด้วยการประมวลผลแบบรวมศูนย์ Redux มิดเดิลแวร์ เป็นตัวอย่างคลาสสิก แต่รูปแบบนี้ถูกใช้ในวงกว้างกว่า: Ktor Client, Bloc, Express.js และ Dio
ประเด็นสำคัญ
มิดเดิลแวร์ คือชั้นซอฟต์แวร์ที่อยู่ระหว่างสององค์ประกอบของระบบ สกัดกั้นและประมวลผลข้อมูลก่อนส่งต่อไปยังองค์ประกอบเป้าหมาย ในการพัฒนาแอปมือถือ มิดเดิลแวร์ถูกใช้ในสามบริบทหลัก: การจัดการสถานะ (Redux, Bloc), การสื่อสาร HTTP (Ktor Client, Dio) และการจัดการเหตุการณ์ (EventBus, NotificationCenter) คุณค่าหลักคือ การแยกความกังวลแบบตัดขวาง (การบันทึก การตรวจสอบสิทธิ์ การวิเคราะห์) ออกจากตรรกะโดเมนของแอปพลิเคชัน แทนที่จะเพิ่มการเรียกวิเคราะห์ไปยังทุกหน้าจอ มิดเดิลแวร์ทำสิ่งนี้แบบรวมศูนย์
มิดเดิลแวร์ใช้รูปแบบ Pipe and Filter: แต่ละองค์ประกอบมิดเดิลแวร์รับข้อมูล ประมวลผล และส่งต่อไปยังห่วงโซ่ถัดไป ลำดับการเชื่อมต่อมิดเดิลแวร์กำหนดลำดับการประมวลผล — มิดเดิลแวร์แรกได้รับข้อมูลดิบ มิดเดิลแวร์สุดท้ายส่งไปยังตัวจัดการเป้าหมาย ตามข้อมูลของ JetBrains (2026) สถาปัตยกรรมนี้ช่วยให้เพิ่มหรือลบมิดเดิลแวร์ได้โดยไม่ต้องเปลี่ยนโค้ดที่มีอยู่ ทำให้การทดสอบและการทดสอบ A/B ของโมดูลทดลองง่ายขึ้น
มิดเดิลแวร์เป็นรูปแบบทั่วไป Interceptor เป็นกรณีพิเศษสำหรับ HTTP มิดเดิลแวร์ทำงานกับโฟลว์ข้อมูลใด ๆ: actions ใน Redux, เหตุการณ์ใน Bloc, คำขอ HTTP ใน Ktor Interceptor ผูกติดกับชั้นเครือข่ายเสมอและทำงานกับ Request/Response เท่านั้น การเข้าใจความแตกต่างนี้ช่วยเลือกนามธรรมที่ถูกต้อง: สำหรับการบันทึกการกระทำของผู้ใช้ — มิดเดิลแวร์, สำหรับการเพิ่มส่วนหัว — Interceptor ในโปรเจกต์ขนาดใหญ่ ทั้งสองรูปแบบมักอยู่ร่วมกัน: มิดเดิลแวร์จัดการสถานะ Interceptor จัดการการสื่อสาร HTTP
Redux มิดเดิลแวร์ สกัดกั้นทุก action dispatch ก่อนที่จะถึง reducer ซึ่งช่วยให้บันทึกการกระทำ ดำเนินการคำขอแบบอะซิงโครนัสผ่าน Redux Thunk หรือ Redux Saga แก้ไข action หรือยกเลิกตามเงื่อนไข แต่ละมิดเดิลแวร์ได้รับ store (การเข้าถึงสถานะ), next (การอ้างอิงถึงมิดเดิลแวร์หรือ reducer ถัดไป) และ action และตัดสินใจว่าจะทำอย่างไร: ส่ง action ต่อ, แก้ไข หรือบล็อก
Middleware<AppState> analyticsMiddleware = (store, action, NextDispatcher next) {
if (action is NavigationAction) {
Analytics.logEvent(action.screenName);
}
return next(action);
};
final store = Store<AppState>>(
reducer,
initialState,
middleware: [analyticsMiddleware]
);
ตัวอย่าง analyticsMiddleware ใน Dart สำหรับ Flutter Redux มิดเดิลแวร์สกัดกั้น NavigationAction ทั้งหมด บันทึกชื่อหน้าจอในระบบวิเคราะห์ และเรียก next(action) เพื่อดำเนินห่วงโซ่ต่อ หากไม่เรียก next action จะไม่ถึง reducer — ด้วยวิธีนี้สามารถนำทางการนำทางแบบมีเงื่อนไขหรือบล็อกการกระทำที่ไม่พึงประสงค์ได้ ลำดับของมิดเดิลแวร์ในอาร์เรย์กำหนดลำดับการประมวลผล
Redux Thunk คือมิดเดิลแวร์ที่อนุญาตให้ dispatch ไม่เพียงแต่ออบเจ็กต์ action แต่ยังรวมถึงฟังก์ชันด้วย ฟังก์ชันรับ dispatch และ getState สามารถดำเนินการแบบอะซิงโครนัส (คำขอ API ผ่านไคลเอ็นต์ HTTP, อ่านจากฐานข้อมูล) และ dispatch actions ปกติเมื่อเสร็จสิ้น นี่เป็นแนวทางมาตรฐานสำหรับคำขอเครือข่ายในแอปพลิเคชัน Redux Redux Saga ใช้เจเนอเรเตอร์ (yield) สำหรับสถานการณ์ที่ซับซ้อนมากขึ้น: การยกเลิกคำขอ, สภาวะการแข่งขัน, การดำเนินการแบบขนาน และดีบาวน์อินพุตของผู้ใช้ ตามข้อมูลของ Redux Saga (2026) โครูทีน Saga ทดสอบและดีบักได้ง่ายกว่าคอลแบ็ก Thunk ที่ซ้อนกัน
Ktor Client โดย JetBrains สร้างการประมวลผล HTTP บนพื้นฐานไปป์ไลน์มิดเดิลแวร์ แต่ละขั้นตอนของคำขอ — การตั้งค่าการเชื่อมต่อ การส่งส่วนหัว การอ่านการตอบสนอง — แสดงโดยเฟสแยกในไปป์ไลน์ นักพัฒนาติดตั้งปลั๊กอิน (มิดเดิลแวร์) ผ่าน client.install { } ได้รับห่วงโซ่การประมวลผล ลำดับการติดตั้งกำหนดว่ามิดเดิลแวร์ใดประมวลผลข้อมูลก่อน: Logging, Auth, ContentNegotiation, Caching
val client = HttpClient {
install(Logging) {
level = LogLevel.BODY
}
install(Auth) {
bearer {
loadTokens { BearerTokens("access", "refresh") }
}
}
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
install(HttpTimeout) {
requestTimeoutMillis = 15000
}
}
การกำหนดค่า Ktor Client พร้อมปลั๊กอินมิดเดิลแวร์ที่ติดตั้งแล้ว Logging — เขียนเนื้อหาคำขอและการตอบสนอง Auth — เพิ่มโทเค็น Bearer โดยอัตโนมัติพร้อมรองรับการรีเฟรช ContentNegotiation — ทำให้ JSON เป็นซีเรียล/ดีซีเรียล HttpTimeout — ตั้งค่าหมดเวลา ปลั๊กอินแต่ละตัวเป็นอิสระ: ในสภาพแวดล้อมการทดสอบสามารถปิดการใช้งาน Auth โดยการแทนที่การกำหนดค่าไคลเอ็นต์โดยไม่ต้องเปลี่ยนโค้ดคำขอ
Dio เป็นไคลเอ็นต์ HTTP ยอดนิยมสำหรับ Flutter ที่ใช้ Interceptor เป็นมิดเดิลแวร์ Interceptor สกัดกั้น RequestOptions ก่อนส่งและ Response หลังจากรับ รองรับห่วงโซ่ของตัวสกัดกั้นหลายตัว Dio Interceptor คล้ายกับ OkHttp Interceptor สำหรับ Dart/Flutter ตามข้อมูลของ Dio (2026) RetryInterceptor และ LogInterceptor เป็นมิดเดิลแวร์ที่ใช้บ่อยที่สุดในโปรเจกต์ Flutter
Bloc ไม่มีมิดเดิลแวร์ในตัวเป็นองค์ประกอบแยก แต่รูปแบบถูกนำไปใช้ผ่าน BlocObserver — ผู้สังเกตการณ์ทั่วโลกที่รับเหตุการณ์จากทุกบล็อกในแอปพลิเคชัน BlocObserver.onEvent ถูกเรียกก่อนประมวลผลแต่ละเหตุการณ์ onTransition ที่การเปลี่ยนสถานะแต่ละครั้ง onError ที่ข้อยกเว้นแต่ละครั้ง นี่คือมิดเดิลแวร์ที่สมบูรณ์สำหรับการวิเคราะห์ การบันทึก การรายงานขัดข้อง และการตรวจสอบประสิทธิภาพ
class AppBlocObserver extends BlocObserver {
@override
void onEvent(Bloc bloc, Object? event) {
Crashlytics.log("${bloc.runtimeType}: $event");
super.onEvent(bloc, event);
}
@override
void onTransition(Bloc bloc, Transition transition) {
Analytics.log(transition.eventName());
super.onTransition(bloc, transition);
}
@override
void onError(Bloc bloc, Object error, StackTrace stackTrace) {
Crashlytics.recordError(error, stackTrace);
super.onError(bloc, error, stackTrace);
}
}
BlocOverrides.runZoned(() {
runApp(MyApp());
}, blocObserver: AppBlocObserver());
ตัวอย่าง AppBlocObserver — มิดเดิลแวร์สำหรับ Bloc ใน Dart onEvent บันทึกทุกเหตุการณ์ใน Crashlytics, onTransition ส่งเหตุการณ์ไปยังการวิเคราะห์, onError เขียนข้อยกเว้นในการรายงานขัดข้อง การเชื่อมต่อผ่าน BlocOverrides.runZoned ทำให้ผู้สังเกตการณ์เป็นสากลสำหรับทุกบล็อกโดยไม่ต้องเปลี่ยนโค้ดของพวกเขา หากต้องการปิดใช้งานในการทดสอบ เพียงส่งผู้สังเกตการณ์ว่างหรือไม่โอเวอร์ไรด์ BlocOverrides
มิดเดิลแวร์มีประสิทธิภาพ สำหรับงานที่ส่งผลกระทบต่อหลายองค์ประกอบ: การบันทึก การตรวจสอบสิทธิ์ การวิเคราะห์ การแคช การตรวจสอบประสิทธิภาพ ใช้มิดเดิลแวร์เมื่อตรรกะเดียวกันซ้ำในส่วนต่าง ๆ ของแอปพลิเคชัน — การเพิ่มโทเค็นในทุกคำขอ การบันทึกทุกการกระทำของผู้ใช้ การวิเคราะห์ทุกการเปลี่ยนหน้าจอ ตามข้อมูลของ Dio (2026) การประมวลผลแบบรวมศูนย์ผ่านมิดเดิลแวร์ลดข้อบกพร่องลง 25% เมื่อเทียบกับการทำซ้ำโค้ดในแต่ละองค์ประกอบแยกกัน
ข้อผิดพลาดที่พบบ่อยที่สุดคือ ลำดับมิดเดิลแวร์ที่ไม่ถูกต้อง เมื่อตัวสกัดกั้นแรกคาดหวังข้อมูลที่ตัวที่สองเพิ่ม ข้อผิดพลาดที่พบบ่อยอันดับสองคือการดำเนินการแบบบล็อกในมิดเดิลแวร์บนเธรดหลัก: การเขียนไฟล์, การเรียก HTTP แบบซิงโครนัส, การเข้ารหัส ข้อผิดพลาดที่สามคือการขาดการจัดการข้อยกเว้น: หากมิดเดิลแวร์โยนข้อยกเว้น ห่วงโซ่ทั้งหมดจะขาดและ action จะไม่ถึง reducer หรือคำขอจะไม่ถูกส่ง ห่อตรรกะมิดเดิลแวร์ใน try-catch เสมอและบันทึกข้อผิดพลาดใน Crashlytics หรือ Sentry โดยไม่ทำลายห่วงโซ่ ตรวจสอบห่วงโซ่มิดเดิลแวร์เป็นประจำในระหว่างการตรวจสอบโค้ด — สิ่งนี้ป้องกันการเสื่อมสภาพของสถาปัตยกรรม
คำถามที่พบบ่อย
Interceptor เป็นกรณีพิเศษของมิดเดิลแวร์สำหรับการสื่อสาร HTTP มิดเดิลแวร์เป็นรูปแบบที่กว้างกว่า: สามารถจัดการ actions (Redux), เหตุการณ์ (Bloc), HTTP (Ktor) และโฟลว์ข้อมูลใด ๆ Interceptor ผูกติดกับชั้นเครือข่ายเสมอและทำงานกับ Request/Response เท่านั้น
ใช้ เมธอดโรงงาน หรือคอนเทนเนอร์ DI (Dagger, Koin, GetIt) ที่ส่งคืนชุดมิดเดิลแวร์ที่แตกต่างกันสำหรับ dev และ prod ใน Redux ส่งอาร์เรย์ว่างในการทดสอบ ใน Ktor ใช้ HttpClient สำหรับทดสอบโดยไม่มีปลั๊กอิน หลักการสำคัญ — มิดเดิลแวร์ไม่ควรถูกฮาร์ดโค้ดในโค้ด
ได้ — มิดเดิลแวร์แก้ไข action ก่อนส่งไปยัง reducer หรือมิดเดิลแวร์ถัดไป ตัวอย่างเช่น Redux มิดเดิลแวร์สามารถเพิ่ม เมทาดาตา (userId, timestamp, deviceId) ให้กับทุก action โดยไม่ต้องเปลี่ยนโค้ดของ dispatcher กฎหลัก — ไม่กลายพันธุ์ออบเจ็กต์ดั้งเดิม แต่สร้างใหม่ผ่านตัวดำเนินการ spread
ใน Ktor คำศัพท์สามารถใช้แทนกันได้ — Ktor Client มิดเดิลแวร์ และ ปลั๊กอิน หมายถึงสิ่งเดียวกัน ปลั๊กอินแต่ละตัวใช้ HttpClientPlugin และติดตั้งผ่าน client.install { } ปลั๊กอินทั้งหมดถูกฝังในไปป์ไลน์คำขอ สร้างห่วงโซ่การประมวลผล
โดยการโอเวอร์ไรด์ BlocObserver.onError — ตัวจัดการทั่วโลกที่เรียกในทุกข้อยกเว้นในบล็อกใด ๆ นี่เป็นทางเลือกแทน try-catch ในแต่ละบล็อก: มิดเดิลแวร์หนึ่งตัวจัดการข้อผิดพลาดแบบรวมศูนย์ เขียนลงใน Crashlytics และแสดง snackbar ให้ผู้ใช้
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม