如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?
Posted
技术标签:
【中文标题】如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?【英文标题】:How to create a dynamic sitemap with mongodb, node.js, express and EJS? 【发布时间】:2018-09-19 20:19:38 【问题描述】:我正在尝试为我的网站创建一个动态站点地图,它有很多经常更改的页面。 站点地图需要从 www.mywebsite.com/sitemap.xml 访问
我当前的尝试查询所有页面的数据库,获取每个页面的 url 并将其传递给创建看起来像 XML 的 EJS 模板。
这里有两个问题
-
到页面的路径不能有文件后缀。例如'.xml'
页面自动被视为 html
我意识到还有其他选项可以使用“express-sitemap”等模块创建站点地图,但我无法为它们找到任何易于理解(我是新手)的文档,并且这对我来说似乎是一种很好的做事方式
【问题讨论】:
你用的是哪个版本的nodejs? 嗨,我使用的是 v6.11.2 版本 【参考方案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;
【讨论】:
以上是关于如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongoose 从 mongoDB 中获取一定数量的对象? (Node.js)