2011-10-11 14 views
27

में डिफ़ॉल्ट रूप से index.html पर सेवा करें। मेरे पास index.html नामक एक स्थिर फ़ाइल है जिसे मैं / का अनुरोध करने पर सेवा देना चाहता हूं। आमतौर पर वेब सर्वर do this by default, लेकिन कंपोज़र नहीं करता है। जब कोई / अनुरोध करता है तो मैं कंपोज़र index.html सेवा कैसे कर सकता हूं?कंपोज़र

; match anything in the static dir at resources/public 
(route/resources "/") 

उत्तर

20

यह एक बहुत सरल अंगूठी मिडलवेयर होगा::

(defn wrap-dir-index [handler] 
    (fn [req] 
    (handler 
    (update-in req [:uri] 
       #(if (= "/" %) "/index.html" %))))) 

बस इस समारोह के साथ अपने मार्गों लपेट, और के लिए अनुरोध

यहाँ कोड मैं स्थिर निर्देशिका के लिए उपयोग कर रहा हूँ है आपके शेष कोड उन्हें देखे जाने से पहले //index.html के अनुरोधों में परिवर्तित हो गए हैं।

(def app (-> (routes (your-dynamic-routes) 
        (resources "/")) 
      (...other wrappers...) 
      (wrap-dir-index))) 
+3

मुझे लगता है कि मेरा बिंदु यह है: कंपोजर ऐसा नहीं करता है, क्योंकि इसके बजाय अंगूठी के साथ करना आसान है। आपका क्लोजर वेब स्टैक एक सर्वव्यापी प्लेटफ़ॉर्म नहीं है, लेकिन प्लग करने योग्य और विशिष्ट टूल की एक श्रृंखला है। उस समस्या के साथ समस्या एक्स हल करें जो इसके लिए डिज़ाइन किया गया है। – amalloy

38

एक वैकल्पिक मार्ग या तो एक अतिरिक्त मार्ग में प्रत्यक्ष प्रतिक्रिया या प्रत्यक्ष प्रतिक्रिया बनाने के लिए एक विकल्प हो सकता है। इस तरह:

(ns compj-test.core 
    (:use [compojure.core]) 
    (:require [compojure.route :as route] 
      [ring.util.response :as resp])) 

(defroutes main-routes 
    (GET "/" [] (resp/file-response "index.html" {:root "public"})) 
    (GET "/a" [] (resp/resource-response "index.html" {:root "public"})) 
    (route/resources "/") 
    (route/not-found "Page not found")) 

"/" मार्ग "index.html" की फ़ाइल प्रतिक्रिया देता है जो सार्वजनिक फ़ोल्डर में मौजूद है। "/ A" मार्ग फ़ाइल index.html 'इनलाइनिंग' द्वारा सीधे प्रतिक्रिया देता है।

अधिक अंगूठी प्रतिक्रियाओं पर: https://github.com/mmcgrana/ring/wiki/Creating-responses

संपादित करें: हटाया अनावश्यक [ring.adapter.jetty] आयात।

+5

हाय। (प्राप्त करें "/" [] (resp/संसाधन-प्रतिक्रिया "index.html" {: रूट "सार्वजनिक"})) मेरे लिए पूरी तरह से काम करता है। – joshua

+0

अपनी इच्छित सामग्री-प्रकार प्रदान न करने से सावधान रहें। एक और मिडलवेयर जैसे 'रैप-कंटेंट-टाइप' आपके कोड को तोड़ सकता है। मैंने पोस्ट किया [एक जवाब] (http://stackoverflow.com/a/32491623/1707589) इसे संबोधित करते हुए। – fasfsfgs

3

हाल ही में मुझे पता चला कि @ amalloy का जवाब काम नहीं करता है जब क्लोजर/कंपोज़र ऐप जेटी या टॉमकैट के तहत एक .war के रूप में चलाया जाता है। इस मामले में :path-info को अद्यतन करने की आवश्यकता है। साथ ही, मुझे लगता है कि यह संस्करण किसी रूट को न केवल "रूट" रूट पर रखेगा।

(defn- wrap-dir-index [handler] 
    (fn [request] 
    (handler 
    (let [k (if (contains? request :path-info) :path-info :uri) v (get request k)] 
     (if (re-find #"/$" v) 
     (assoc request k (format "%sindex.html" v)) 
     request))))) 

यह भी देखें: https://groups.google.com/forum/#!msg/compojure/yzvpQVeQS3w/RNFkFJaAaYIJ

UPDATED: एक संस्करण है कि काम करता है के साथ बदला उदाहरण।

25
(ns compj-test.core 
    (:use [compojure.core]) 
    (:require 
     [ring.util.response :as resp])) 

(defroutes main-routes 
    (GET "/" [] (resp/redirect "/index.html"))) 

जो आप पूछ रहे हैं वह/to /index.html से रीडायरेक्ट है। यह (रेस/रीडायरेक्ट लक्ष्य) जितना सरल है। जटिल चीजों को खत्म करने की कोई ज़रूरत नहीं है।

+2

यह सबसे सीधी और तार्किक प्रतिक्रिया थी, धन्यवाद! – scape

+1

हाँ यह मेरे लिए काम करने वाला एकमात्र ऐसा था जो – Zubair

18

यह ठीक काम करता है। एक अंगूठी मध्य-बर्तन लिखने की जरूरत नहीं है।

(:require [clojure.java.io :as io]) 

(defroutes app-routes 
(GET "/" [] (io/resource "public/index.html"))) 
+0

पता नहीं है कि यह प्रश्न का उत्तर देता है लेकिन इससे मुझे जो चाहिए वह मेरी मदद करता है! Upvoted! धन्यवाद! – leontalbot

+0

अपनी इच्छित सामग्री-प्रकार प्रदान न करने से सावधान रहें। एक और मिडलवेयर जैसे 'रैप-कंटेंट-टाइप' आपके कोड को तोड़ सकता है। मैंने पोस्ट किया [एक जवाब] (http://stackoverflow.com/a/32491623/1707589) इसे संबोधित करते हुए। – fasfsfgs

0

बस एक विचार बिनिता, एक गोचाचा मैं अनुभव कर रहा हूं। बावजूद मैं किसी भी प्रलेखन आदेश को परिभाषित करने Compojure मार्गों मुझे पता है कि इस

(GET "/*" [] r/static) 
(GET "/" [] (clojure.java.io/resource "public/index.html")) 

काम नहीं करता है, जबकि इस

(GET "/" [] (clojure.java.io/resource "public/index.html")) 
(GET "/*" [] r/static) 

जाहिर * matchs भी रिक्त स्ट्रिंग काम करता है के महत्व के बारे में नहीं मिल सका लेकिन मैंने सोचा कि आदेश बिल्कुल कोई फर्क नहीं पड़ता।

+0

अपनी इच्छित सामग्री-प्रकार प्रदान न करने से सावधान रहें। एक और मिडलवेयर जैसे 'रैप-कंटेंट-टाइप' आपके कोड को तोड़ सकता है। मैंने पोस्ट किया [एक जवाब] (http://stackoverflow.com/a/32491623/1707589) इसे संबोधित करते हुए। – fasfsfgs

1

जब अन्य कोड काम नहीं करता है, इस कोड को आज़माएं।

(GET "/about/" [] (ring.util.response/content-type 
        (ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html")) 
+2

कृपया अन्य पाठकों के लिए इसे और अधिक उपयोगी बनाने के लिए अपने उत्तर में कुछ स्पष्टीकरण जोड़ें। –

+0

ग्रेट उत्तर। यह अंगूठी प्रदान किए गए समाधानों का उपयोग करके अपनी सामग्री-प्रकार निर्दिष्ट करने वाला संसाधन प्रदान करता है। – fasfsfgs

7

यहाँ जवाब का एक बहुत देखने के बाद, मैं निम्नलिखित कोड का उपयोग कर रहा:

(ns app.routes 
    (:require [compojure.core :refer [defroutes GET]] 
      [ring.util.response :as resp])) 

(defroutes appRoutes 
    ;; ... 
    ;; your routes 
    ;; ... 
    (GET "/" [] 
     (resp/content-type (resp/resource-response "index.html" {:root "public"}) "text/html")))) 
  • कोई रीडायरेक्ट;
  • किसी अन्य मिडलवेयर की आवश्यकता नहीं है;
  • index.html सही फ़ोल्डर (संसाधन/सार्वजनिक/index.html) में रहता है;
  • यह अन्य मिडलवेयर के साथ काम करता है (कुछ अंगूठी डिफ़ॉल्ट मिडलवेयर के साथ उपयोग करते समय कई जवाब तोड़ते हैं);
  • यह सामग्री-प्रकार प्रदान करता है ताकि यह रैप-सामग्री-प्रकार मिडलवेयर के साथ काम करता हो।

ring-defaults देखें। इसमें आपकी प्रोजेक्ट्स पर मिडलवेयर का सर्वोत्तम अभ्यास है।

+0

फॉर्म प्राप्त करें खाली पैरामीटर गुम हैं [], अन्यथा यह वही है जो मुझे चाहिए, धन्यवाद! – hequ

+0

@hequ धन्यवाद! उन लापता ब्रैकेट के साथ उत्तर अपडेट किया गया। – fasfsfgs

+0

'फॉर्म/कंटेंट-टाइप' को किसी रूप में लपेटा नहीं जाना चाहिए? –

संबंधित मुद्दे