如何使用MongoDB、Node.js、Express和EJS创建动态站点地图?

3
我正在尝试为我的网站创建一个动态站点地图,它有许多经常更改的页面。站点地图需要从www.mywebsite.com/sitemap.xml访问。
我的当前尝试是查询数据库中所有页面的url,并将每个页面的url传递给一个EJS模板,该模板创建类似XML的内容。
我在这里有两个问题:
  1. 页面的路径不能有文件后缀,例如'.xml'
  2. 页面自动被视为html
我意识到使用"express-sitemap"等模块创建站点地图还有其他选项,但我找不到任何易于理解(我是新手)的文档,而且这种方法对我来说似乎是一个好方法。

你正在使用哪个版本的Node.js? - Muhammad Faizan
嗨,我正在使用版本v6.11.2。 - CopyPasteThankYou
2个回答

9

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

0

这是我制作txt网站地图的方法。 我发现Google搜索控制台获取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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接