【问题标题】:How to create a dynamic sitemap with mongodb, node.js, express and EJS?如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?
【发布时间】:2018-09-19 20:19:38
【问题描述】:

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

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

这里有两个问题

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

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

【问题讨论】:

  • 你用的是哪个版本的nodejs?
  • 嗨,我使用的是 v6.11.2 版本

标签: node.js mongodb express ejs sitemap.xml


【解决方案1】:

是的,您可以使用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 );
  });
});

【讨论】:

    【解决方案2】:

    这是我制作 txt 站点地图的方法。我发现 Google Search Console 更容易获取 txt 站点地图和 xml 站点地图。但是如果你想制作一个 xml 站点地图,你可以查看this blog 以获得正确的格式。此代码使用 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;
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2013-03-17
      • 2019-09-09
      • 2019-06-22
      • 2015-09-06
      相关资源
      最近更新 更多