SvelteKit के साथ कोई XML, या अन्य गैर-HTML आउटपुट कैसे प्रस्तुत कर सकता है? मैं अपने ब्लॉग के लिए Google sitemap.xml और RSS फ़ीड प्रस्तुत करने के लिए SvelteKit का उपयोग करना चाहता/चाहती हूं।

-1
Mikko Ohtamaa 10 अक्टूबर 2021, 12:33

2 जवाब

सबसे बढ़िया उत्तर

आप एक समापन बिंदु बनाएंगे और एक अलग Content-Type परिभाषित करेंगे:

// example.xml.js
export async function get() {
  const xml = 
`<?xml version="1.0" encoding="UTF-8"?>
<data>
  <field>This is an example</field>
</data>
`
  return {
    status: 200,
    body: xml,
    headers: {
      'Content-Type': 'application/xml'
    }
  }
}

वैकल्पिक दृष्टिकोण

यदि आप चाहते हैं कि आप एक नियमित मार्ग बना सकें जहां आप स्वेल्ट घटकों का उपयोग कर सकते हैं और handle हुक में प्रतिपादन को हाईजैक कर सकते हैं, लेकिन यह दृष्टिकोण बहुत नाजुक है क्योंकि केवल हेडर बदलना पर्याप्त नहीं है, फ़ाइल अभी भी प्रस्तुत की जाएगी अन्य फ़्लफ़ आमतौर पर इसके आस-पास के HTML पृष्ठों (जैसे बॉडी और हेड टैग) से जुड़े होते हैं, इसलिए आपको पहले उन्हें काटने का एक तरीका खोजना होगा।

<!-- example.xml.svelte -->
<script>
  let value = 0
</script>
<data>
  <field>{value}</field>
</data>
// hooks.js
export async function handle({ request, resolve }) {
    const response = await resolve(request)

    if (request.path.endsWith('.xml')) {        
        // Set the content type to xml
        response.headers["content-type"] = "application/xml"

        // remove whitespace
        response.body = response.body.replaceAll('\n','')
        response.body = response.body.replaceAll('\t','')

        // find the body tags if present
        const start = response.body.indexOf('<body>')
        const stop = response.body.indexOf('</body>')
        if (start > 0 && stop > 0) {
            // only show the content of the body
            response.body = response.body.substring(start + 6, stop)
        }
    }
    return { 
        ...response
    }
}
1
Stephane Vanraes 11 अक्टूबर 2021, 12:59
उत्तम। मुझे लगता है कि स्वेल्टे घटक स्वयं एक्सएमएल आउटपुट नहीं बना सकते हैं और मुझे हैंडलबार्स की तरह एक और टेम्पलेट इंजन लाने की जरूरत है?
 – 
Mikko Ohtamaa
11 अक्टूबर 2021, 12:41
1
मैंने नियमित रूट घटक का उपयोग करके एक विकल्प जोड़ा, बल्कि मेरी राय में 'हैकी'।
 – 
Stephane Vanraes
11 अक्टूबर 2021, 13:00
हां, मैं सहमत हूं - इसे साफ-सुथरे तरीके से करना बेहतर है।
 – 
Mikko Ohtamaa
11 अक्टूबर 2021, 13:34

संदर्भ के लिए, मैंने Stephane Vanraes उत्तर के आधार पर sitemap.xml उत्पन्न करने का एक पूर्ण उदाहरण शामिल किया।

ये रहा routes/sitemap.xml.ts:

// sitemap.xml generation


// This sitemap is manually maintained and page paths included here one by one
const staticPages = [
    "",
    "about",
    "trading-view",
    "trading-view/backtesting",
    "community",
    "trading-view/exchanges",
    "trading-view/blockchains",
]


/***
 * Sitemap.xml HTTP GET endpoint
 *
 * For more information see https://stackoverflow.com/a/69523302/315168
 */
export async function get(page) {
  
  // SvelteKit page object does not include protocol, so assume HTTPS
  const proto = "https";

  // Generate the sitemap.xml file with string fiddling
  const fragments = [];
  for(let path of staticPages) {
    const fullUrl = `${proto}://${page.host}/${path}`;
    fragments.push(`<url><loc>${fullUrl}</loc></url>`);
  }

  // Build the XML for pages
  const urlXml = "".concat(...fragments);

  // See https://en.wikipedia.org/wiki/Sitemaps
  const xml =
    `<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
   ${urlXml}
</urlset>`

  return {
    status: 200,
    body: xml,
    headers: {
      'Content-Type': 'application/xml'
    }
  }
}
0
Mikko Ohtamaa 17 अक्टूबर 2021, 18:48