如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?

Cop*_*You 2 ejs mongodb sitemap.xml node.js express

我正在尝试为我的网站创建一个动态站点地图,它有很多经常更改的页面。需要从 www.mywebsite.com/sitemap.xml 访问站点地图

我当前的尝试是查询所有页面的数据库,获取每个页面的 url 并将其传递给一个 EJS 模板,该模板创建看起来像 XML 的内容。

我这里有两个问题

  1. 页面的路由不能有文件后缀。例如'.xml'
  2. 该页面被自动视为 html

我意识到还有其他选项可以使用“express-sitemap”等模块创建站点地图,但我找不到任何易于理解的(我是新手)文档,这似乎是一个好方法对我做事

Muh*_*zan 9

是的,你可以使用 express-sitemap

自动生成站点地图

var sitemap = require('express-sitemap')();
 
var app = require('express')();
 
sitemap.generate(app);
Run Code Online (Sandbox Code Playgroud)

动态生成..

因为假设您有产品页面并且您已经为它们指定了 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
    });
}
Run Code Online (Sandbox Code Playgroud)

您可以在例程中或与 cron 一起使用此功能并定期生成站点地图。

setInterval(generateSitemap, 360000); //running every hour
Run Code Online (Sandbox Code Playgroud)

你可以做的另一件事是:

使用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/');
Run Code Online (Sandbox Code Playgroud)

你可以在这样的路线上服务:

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 );
  });
});
Run Code Online (Sandbox Code Playgroud)