NodeJS 如何在expressjs中生成站点Map

kjthegm6  于 2023-04-05  发布在  Node.js
关注(0)|答案(6)|浏览(173)

我从sitemap xml generator网站下载了我的XML sitemap。我把我的sitemap.xml放在我的公共目录下,但是当我试图将sitemap.xml提交到谷歌控制台时,我收到了以下错误:一般HTTP错误:404 Not Found HTTP错误:404个
所以我编码了
app.get('/sitemap.xml', function( req, res, next ) { res.header('Content-Type', 'text/xml'); res.render( 'sitemap' ); )};
当我导航到'website/sitemap.xml'我得到以下错误:

此页面包含以下错误:

  • 第42列第1行的错误:属性itemscope的规范强制值 *

谢谢你的帮忙

h9vpoimq

h9vpoimq1#

使用https://www.xml-sitemaps.com/等工具生成sitemap.xml文件
上传项目中的sitemap.xml
然后将其添加到.js文件中:

router.get('/sitemap.xml', function(req, res) {
res.sendFile('YOUR_PATH/sitemap.xml');
});

请确保将YOUR_PATH更改为sitemap.xml文件所在的实际路径。

rqcrx0a6

rqcrx0a62#

Sitemaps不一定是XML文档。一个简单的带有URL的文本文件就足够了,所以下面的代码也可以正常工作。在下面的例子中,fetchMyUrls()是一个函数/方法,它异步获取并返回可用的URL作为字符串数组(URL字符串)。

async function index (req, res){
    return fetchMyUrls().then((urls) => {
      var str = '';
      for (var url of urls) {
        str = str + url + '\n';
      }
      res.type('text/plain');
      return res.send(str);
    });  
}
hwamh0ep

hwamh0ep3#

对于那些正在寻找一种在代码上动态创建XML的方法,并且不想使用其他库或将文件存储在公用文件夹中的人,可以使用以下命令:

app.get('/sitemap.xml', async function(req, res, next){
  let xml_content = [
    '<?xml version="1.0" encoding="UTF-8"?>',
    '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
    '  <url>',
    '    <loc>http://www.example.com/</loc>',
    '    <lastmod>2005-01-01</lastmod>',
    '  </url>',
    '</urlset>'
  ]
  res.set('Content-Type', 'text/xml')
  res.send(xml_content.join('\n'))
})
i1icjdpr

i1icjdpr4#

在我的NodeJS express项目中,没有安装任何库,我能够使用我喜欢的视图引擎(handlebar)将其添加到我的路由中。

export const routes: RouteMapper[] = [
    {
        "/sitemap.xml": [
        {
            method: "get",
            handler: (req, res) =>
            res.sendFile("/src/views/sitemap.xml", { root: "." }),
        },
      ],
    },
];

干杯!

disbfnqx

disbfnqx5#

最好的方法是创建一个脚本来自动生成站点Map。在很多情况下,URL应该是基于数据库中的数据动态的。
sitemap包是在Express中创建站点Map的一个很好的包:

第一步

创建一个中间件,它将动态生成站点Map,然后将其缓存为下次对服务器的调用。例如,我们可以将逻辑提取到名为sitemap_generator.js的单独文件中,我们可以为它定义和导出generate_sitemap中间件:

const { SitemapStream, streamToPromise } = require('sitemap');
const { Readable } = require('stream');
let sitemap;

const generate_sitemap = async (req, res, next) => {

  res.header('Content-Type', 'application/xml');

  if (sitemap) return res.status(200).send(sitemap); // If we have a cached entry send it

  let changefreq = 'weekly';

  try {

    let links = [
      { url: '', changefreq, priority: 1 },
      { url: 'aboutus', changefreq, priority: 0.9 },
      { url: 'blog', changefreq },
      { url: 'login', changefreq },
      { url: 'register', changefreq },
    ];

    // Additionally, you can do database query and add more dynamic URLs to the "links" array.

    const stream = new SitemapStream({ hostname: 'https://example.com', lastmodDateOnly: true })
    return streamToPromise(Readable.from(links).pipe(stream)).then((data) => {
      sitemap = data; // Cache the generated sitemap
      stream.end();
      return res.status(200).send(data.toString())
    });

  } catch (error) {
    return res.status(500).end();
  }
}

module.exports = { generate_sitemap };

第二步

在服务器配置文件中从sitemap_generator.js导入generate_sitemap中间件,并将其堆到/sitemap.xml端点:

const { generate_sitemap } = require('./sitemap_generator');

...

app.get('/sitemap.xml', generate_sitemap);

就是这样。您的站点Map现在应该在/sitemap.xml端点上可用,因此在浏览器中导航到该端点并检查它是否在那里。

z9smfwbn

z9smfwbn6#

从网站生成sitemap.xml文件后-以https://www.xml-sitemaps.com/为例-您可以简单地复制/粘贴:

app.use('/sitemap.xml', function (req, res, next) {
      res.type('text/xml')
      res.send(
  `<?xml version="1.0" encoding="UTF-8"?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
     <url>
        <loc>https://yourwebsite.com/</loc>
        <lastmod>2023-03-28T00:00:00+00:00</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.0</priority>
     </url>
     <url>
        <loc>https://yourwebsite.com/page1/</loc>
        <lastmod>2023-03-28T00:00:00+00:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.9</priority>
     </url>
     <url>
        <loc>https://yourwebsite.com/page2/</loc>
        <lastmod>2023-03-28T00:00:00+00:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.7</priority>
     </url>
     <url>
        <loc>https://yourwebsite.com/page3/</loc>
        <lastmod>2023-03-28T00:00:00+00:00</lastmod>
        <changefreq>yearly</changefreq>
        <priority>0.6</priority>
     </url>
     <url>
        <loc>https://yourwebsite.com/page5/</loc>
        <lastmod>2023-03-28T00:00:00+00:00</lastmod>
        <changefreq>yearly</changefreq>
        <priority>0.5</priority>
     </url>
  </urlset>`);
  });

相关问题