Я пытаюсь создать динамическую карту сайта для своего веб-сайта, на нем много страниц, которые часто меняются. Карта сайта должна быть доступна по адресу www.mywebsite.com/sitemap.xml.
Моя текущая попытка запрашивает в базе данных все страницы, получает URL-адрес каждой страницы и передает его в шаблон EJS, который создает то, что выглядит как XML.
У меня здесь две проблемы
Я понимаю, что есть и другие варианты создания карты сайта с использованием таких модулей, как «express-sitemap», но мне не удалось найти для них понятную (я новичок в этом) документацию для них, и это кажется хорошим способом делать что-то со мной
привет, пользуюсь версией, v6.11.2





да, вы можете использовать express-sitemap
var sitemap = require('express-sitemap')();
var app = require('express')();
sitemap.generate(app);
предположим, что у вас есть страницы продуктов, и вы указали для них URL. Вы можете каждый раз создавать динамический файл и помещать его в общую папку.
const Product = require('./model/product')
const sitemap = require('sitemap');
let sitemapData;
const generateSitemap = async () => {
const products = await Product.find({},{path: 1});
const urls = products.map({path} => `/products/${path}`)
sitemapData = sitemap.createSitemap ({
hostname: 'http://example.com',
cacheTime: 600000, // 600 sec - cache purge period
urls
});
}
Вы можете использовать эту функцию в обычном порядке или с помощью cron и регулярно генерировать карту сайта.
setInterval(generateSitemap, 360000); //running every hour
другое, что вы можете сделать, это:
используйте переменную sitemapData и делайте вот так.
sitemapData.add({url: '/product-a/'}); // when some product is added
sitemapData.add({url: '/product-b/', changefreq: 'monthly', priority: 0.7});
sitemapData.del({url: '/product-c/'}); // when something is removed
sitemapData.del('/product-d/');
вы можете подавать его следующим образом:
app.get('/sitemap.xml', function(req, res) {
sitemapData.toXML( function (err, xml) {
if (err) {
return res.status(500).end();
}
res.header('Content-Type', 'application/xml');
res.send( xml );
});
});
Вот как я сделал карту сайта в формате txt. Я считаю, что в Google Search Console проще получать карты сайта в формате txt, а не в формате XML. Но если вы хотите создать карту сайта в формате xml, вы можете посмотреть на этот блог для правильного форматирования. Этот код использует Mongoose и сохраняется как /pages/sitemap.txt.js.
// pages/sitemap.txt.js
import dbConnect from "../utils/dbConnect";
import Pduct from "../models/Pduct";
const createSitemap = (posts) => `${posts
.map(({ slug }) => {
return `https://[YOUR DOMAIN]/${slug}`;
})
.join("\n")}
`;
export async function getServerSideProps({ res }) {
await dbConnect();
const request = await Pduct.find({}, "slug").lean();
res.setHeader("Content-Type", "text");
res.write(createSitemap(request));
res.end();
}
export default () => null;
какую версию nodejs вы используете?