0Pricing
Ruby Academy · บทเรียน

มิดเดิลแวร์และ Rack

สแตก Rack

มิดเดิลแวร์และ Rack เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

Rack คืออะไร

Rack คืออินเทอร์เฟซขั้นต่ำระหว่างเว็บเซิร์ฟเวอร์ Ruby กับเฟรมเวิร์กต่าง ๆ โดย Sinatra, Rails และเฟรมเวิร์กอื่น ๆ ล้วนทำงานบน Rack

  • กำหนดมาตรฐานวิธีการไหลของคำขอและการตอบกลับ
  • ทำให้สามารถนำมิดเดิลแวร์กลับมาใช้ซ้ำได้
  • แอป Rack คือสิ่งใดก็ตามที่ตอบสนองต่อ call(env)
app = lambda do |env|
  [200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end

puts app.call({}).inspect

สัญญาของ Rack

call ของแอป Rack ต้องส่งคืนอาร์เรย์สามองค์ประกอบ

  • จำนวนเต็มสถานะ เช่น 200
  • แฮชส่วนหัว
  • เนื้อหาที่ตอบสนองต่อ each ซึ่งโดยปกติจะเป็นอาร์เรย์ของสตริง
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }

แฮช env

อาร์กิวเมนต์ env คือแฮชที่อธิบายคำขอ

  • REQUEST_METHOD เช่น GET หรือ POST
  • PATH_INFO คือเส้นทางที่ร้องขอ
  • QUERY_STRING คือพารามิเตอร์คำขอดิบ
env = { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/home' }
puts "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"

มิดเดิลแวร์คืออะไร

มิดเดิลแวร์จะห่อแอปเพื่อเพิ่มการทำงานก่อนหรือหลังคำขอจะไปถึงแอปนั้น

  • การบันทึกเหตุการณ์ การยืนยันตัวตน และการบีบอัด
  • มิดเดิลแวร์แต่ละตัวก็ตอบสนองต่อ call(env) เช่นกัน
  • เรียกแอปถัดไปในสายการทำงาน
class Logger
  def initialize(app)
    @app = app
  end

  def call(env)
    puts "Request: #{env['PATH_INFO']}"
    @app.call(env)
  end
end

การสร้างคลาสมิดเดิลแวร์

มิดเดิลแวร์จะเก็บแอปที่ถูกห่อไว้ และส่งต่องานให้แอปนั้นใน call

  • ตัวสร้างจะรับแอปภายใน
  • call สามารถแก้ไข env แล้วส่งต่อได้
  • นอกจากนี้ยังสามารถแก้ไขการตอบกลับขณะส่งกลับได้
class UpcaseBody
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    new_body = body.map(&:upcase)
    [status, headers, new_body]
  end
end

puts 'Middleware defined'

สแตกมิดเดิลแวร์

มิดเดิลแวร์รวมกันเป็นสแตก คำขอจะไหลลงไปยังแอป ส่วนการตอบกลับจะไหลย้อนกลับขึ้นมา

  • มิดเดิลแวร์ชั้นนอกสุดทำงานก่อนในขาเข้า
  • มิดเดิลแวร์ชั้นนอกสุดทำงานเป็นตัวสุดท้ายในขาออก
inner = lambda { |env| [200, {}, ['core']] }

class Wrap
  def initialize(app); @app = app; end
  def call(env)
    s, h, b = @app.call(env)
    [s, h, b.map { |x| "[#{x}]" }]
  end
end

puts Wrap.new(inner).call({}).last.inspect

การใช้มิดเดิลแวร์ใน Sinatra

เพิ่มมิดเดิลแวร์ให้แอป Sinatra ด้วย use

  • use Rack::Logger
  • ลำดับการเรียก use จะกำหนดลำดับของสแตก
require 'sinatra'

use Rack::Logger

get '/' do
  'Logged request'
end

config.ru และ rackup

ไฟล์ config.ru จะเริ่มต้นแอป Rack ด้วย rackup หรือ Puma

  • run จะกำหนดแอปสุดท้าย
  • use จะเพิ่มมิดเดิลแวร์ไว้ก่อนหน้านั้น
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Application

มิดเดิลแวร์ในตัวที่ใช้บ่อย

Rack มาพร้อมมิดเดิลแวร์ที่มีประโยชน์หลายรายการ

  • บันทึกคำขอด้วย Rack::CommonLogger
  • การบีบอัด gzip ด้วย Rack::Deflater
  • ให้บริการไฟล์ด้วย Rack::Static
  • เซสชันด้วย Rack::Session::Cookie
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'

การแก้ไขการตอบกลับ

มิดเดิลแวร์มักเพิ่มส่วนหัวการตอบกลับหลังจากแอปภายในทำงานเสร็จ

  • เก็บชุดสามส่วนของการตอบกลับไว้
  • แก้ไขส่วนหัว แล้วส่งคืนชุดนั้น
class AddHeader
  def initialize(app); @app = app; end
  def call(env)
    status, headers, body = @app.call(env)
    headers['X-Powered-By'] = 'Ruby'
    [status, headers, body]
  end
end

app = AddHeader.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[1].inspect

การตัดคำขอให้สิ้นสุดก่อน

มิดเดิลแวร์สามารถหยุดคำขอได้โดยไม่เรียกแอปภายใน

  • มีประโยชน์สำหรับด่านการยืนยันตัวตนหรือการจำกัดอัตรา
  • ส่งคืนชุดสามส่วนของการตอบกลับโดยตรง
class Auth
  def initialize(app); @app = app; end
  def call(env)
    return [401, {}, ['Unauthorized']] unless env['token']
    @app.call(env)
  end
end

app = Auth.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[0]

ตรวจสอบความรู้

ตรวจสอบความเข้าใจเกี่ยวกับ Rack ของคุณ

ทบทวน

คุณได้เรียนรู้เกี่ยวกับสแตก Rackดังนี้

  • Rack คืออินเทอร์เฟซร่วมที่อยู่เบื้องหลังเฟรมเวิร์กเว็บ Ruby
  • แอป Rack ตอบสนองต่อ call(env) และส่งคืน [status, headers, body]
  • มิดเดิลแวร์จะห่อแอปเพื่อเพิ่มการทำงานที่ใช้ร่วมกันหลายส่วน
  • ใช้ use ใน Sinatra หรือ config.ru เพื่อประกอบสแตก
  • มิดเดิลแวร์สามารถแก้ไขการตอบกลับหรือตัดคำขอให้สิ้นสุดก่อน

คำถามที่พบบ่อย

บทเรียน “มิดเดิลแวร์และ Rack” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มิดเดิลแวร์และ Rack” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์และ Rack”

สแตก Rack คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “มิดเดิลแวร์และ Rack” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม

ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน Sinatra
  2. เส้นทางและพารามิเตอร์
  3. API แบบ JSON
  4. มิดเดิลแวร์และ Rack
← กลับไปที่ Ruby Academy