Как создать динамическую карту сайта в следующем js с помощью пакета sitemap?

#xml #next.js #sitemap #parse-server

Вопрос:

Я использую next js и back4app для своего веб-приложения. Я наткнулся на sitemap библиотеку, чтобы написать карту сайта, но я вообще не могу создать динамическую карту сайта. Я не могу запускать какие-либо вызовы api или облачный код, у меня есть определенная функция, которая будет возвращать все маршруты, чтобы я мог передавать их по каналу. Вот мой пример кода ниже:

 import { SitemapStream, streamToPromise } from "sitemap";
const {Readable} = require("stream");
import cacheData from 'memory-cache';
import { initializeParse } from '@parse/react-ssr';



initializeParse( 
    'https://parseapi.back4app.com',
    '********************',
    '*********************'
  );

const sitemap = async (req,res) => {

    try{
        const links = [
            { url: "/blogggy", changefreq: "daily", priority: 0.3 },
        ];
        const userParams = {
            authKey: "***********************"
        }


         Parse.Cloud.run("getAllRoutes",userParams).then(response =>{
             response.map((handle) => {
                 links.push({
                   url: `/${handle}`,
                   changefreq: "daily",
                   priority: 0.9,
                 });
               })
         }).catch(e =>{
             res.send(JSON.stringify(e));
         })
        

        const pages = ["/explore"];
        pages.map((url) => {
          links.push({
            url,
            changefreq: "daily",
            priority: 0.9,
          });
        });
        
        const stream = new SitemapStream({hostname: `https://${req.headers.host}`}) ; 
        
        res.writeHead(200,{
            "Content-Type": "application/xml",
        });
        
        const xmlString = await streamToPromise(
            Readable.from(links).pipe(stream)
        ).then((data) => data.toString());
        
        res.end(xmlString);
    }
    catch(e){
        console.log(e);
        res.send(JSON.stringify(e));
    }
};


export default sitemap 

Я также попробовал getServerSideProps, но это не сработало. Как мне решить эту проблему?

Комментарии:

1. Я вижу, вы не ждете разбора. Cloud.run() для завершения. Таким образом, вы пытаетесь ответить на ссылки до того, как они были фактически отправлены. Это, безусловно, проблема, но я не уверен, что это единственная. Не могли бы вы поделиться любыми журналами или подробностями, которые у вас есть, и что именно не работает с вашим кодом?

2. Я уже пробовал метод ожидания, но он не сработал. Карта сайта становится пустой строкой с выводом {} всякий раз, когда я использую асинхронность, и поскольку это XML-файл, я не могу создавать какие-либо журналы консоли для того же самого!

Ответ №1:

Опять же, я не уверен, что это единственная проблема с вашим кодом, но попробуйте переписать вызов функции облачного кода на что-то подобное:

 let response;
try {
  response = await Parse.Cloud.run("getAllRoutes",userParams);
}
catch (e) {
  res.send(JSON.stringify(e));
  return;
}
response.map((handle) => {
  links.push({
    url: `/${handle}`,
    changefreq: "daily",
    priority: 0.9,
  });
});
 

Комментарии:

1. позвольте мне попробовать это и вернуться к вам !