#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. позвольте мне попробовать это и вернуться к вам !