2016-10-28 1 views
1

나는 미들웨어만으로 구성된 간단한 Ruby Rack 앱을 가지고 있습니다. 미들웨어는 내가 원하는 모든 것을하기 때문에 "앱"이 정말로 필요하지 않습니다. 내 config.ru을 미들웨어 만 앱으로 실행하도록 어떻게 정의 할 수 있습니까?미들웨어로만 구성된 간단한 Ruby Rack 앱을 실행하는 방법은 무엇입니까?

require "some_middleware" 
use SomeMiddleware 
run -> {|env| [200, {"Content-Type" => "text/plain"}, ["I don't need this part!"]] } 
+0

그냥 미들웨어입니까? 유효한 랙 응답 설정 여부에 따라 다릅니다. 코드를 제공 할 수 있습니까? – tompave

+1

미들웨어가 이미 모든 것을 수행하는 경우 사용하지 않고 실행할 수 있습니까? – phoet

답변

2

(미들웨어 포함) 랙 앱 기본적 해시 요청을 설명하고 응답을 설명하는 배열을 반환 접수, call 응답 단지 목적이다.

rackup 파일을 사용하는 경우 Rack은 Rack::Builder에 설명 된 DSL을 사용합니다. run method just sets the “base” app :

def run(app) 
    @run = app 
end 

use 방법을 저장 한 후 미들웨어 앱에 포함 할 클래스, 최종 응용 프로그램을 구성 할 때 수행 그들이 config.ru에 표시되는 방법의 역순으로 각각에 대해이 같은 (파일) :

이것은 다소 복잡합니다. 그러나 이것은 일반적인 아이디어입니다. 기존 애플 리케이션이 생성자의 첫 번째 인수로 전달 된 미들웨어 클래스의 새 인스턴스가 만들어지고 결과 객체가 새 응용 프로그램이됩니다. 랙 미들웨어에 대한 (잘 설명되지 않은) "인터페이스"입니다. 초기화 프로그램의 첫 번째 인수는 포장하는 응용 프로그램이고, 나머지는 use에 전달 된 다른 인수입니다.

DSL에서는 항상 run 또는 map 문이있을 것으로 예상하므로 둘 다를 생략하면 오류가 발생합니다. 미들웨어는 그것의 초기화에 전달 된 인수가없는 처리 할 수 ​​있으며 전체 응용 프로그램처럼 동작합니다 방식으로 작성된 경우

, 당신은 config.ru에서 응용 프로그램으로 직접 사용할 수 있습니다 :

run SomeMiddleware.new 

이것은 Sinatra가 허용하는 허용 범위 인 used as middleware입니다. 그것은 주어진 경우 stores the app in the initializer 그리고 어떤 요청과 일치하지 않는 경로가 도착하면 @app to decide whether to behave as middleware의 존재를 사용하고에 대한 요청을 전달하거나 최종 응용 프로그램으로 동작하여 발견되지 않은 오류로 처리합니다.

미들웨어에 유연성이없는 경우 예제와 같이 랩핑 할 응용 프로그램을 제공해야합니다. 이 경우 미들웨어가 요청을 올바르게 처리하지 못하고 래핑 된 앱에 오류를 전달하려고 할 때 오류 처리를 위해 앱을 사용하는 것이 유용 할 수 있습니다. 당신이 당신의 config.ru 별도의 userun 문을 사용하지 않도록하려면

, 당신은 단지 run를 사용하고 미들웨어에 직접 간단한 응용 프로그램을 전달할 수 :이 위에서 설명한 인터페이스를 다음 방법

run SomeMiddleware.new(->(e){ 
    [500, {'Content-type' => 'text/plain'}, ["Error: SomeMiddleware didn't handle request"]] 
} 

주 미들웨어의 경우 : 초기화 프로그램의 첫 번째 인수는 줄 바꿈 할 앱입니다.

관련 문제