Shaoli's Blog

nuxt项目中,使用 express 动态生成 sitemap.xml

首先先安装 node 请求模块

npm i request


# server/index.js

const path = require('path')
const express = require('express')
const consola = require('consola')
const request = require('request')
const { Nuxt, Builder } = require('nuxt')
const app = express()
const isDev = process.env.mode === 'dev'
const isBuild = process.env.action === 'build'
// Import and Set Nuxt.js options
const config = require('../nuxt.config.js')
Object.assign(config, {
  dev: isDev
})
app.use(express.static(path.join(__dirname, 'static')))


// 动态生成 sitemap.xml
const xmlTypes = [
  'esnews',
  'esarticle',
  'esuser',
  'esleague',
  'esteam',
  'esplayer',
  'eslive'
]
const baseURL = 'http://xxx.xxx.xx'
const url = '/api/getUrlSeoList'
app.get('/*.xml', (req, res, next) => {
  const reqUrl = req.url  // esnews-1.xml、esnews-2.xml...
  const params = reqUrl.substring(1).split('.')[0].split('-'// ['esnews', 1]
  const type = params[0// sitemap类型
  const page = params[1]  // 当前分页数
  // 指定部分 sitemap 动态生成,其他直接用 xml文件
  if (xmlTypes.includes(type)) {
    // 请求远程数据,用于拼接 xml
    request({
      url: `${baseURL}${url}`,
      method: 'GET',
      form: {
        type,
        page
      }
    }, (error, response, body) => {
      if (error) {
        res.status(200).send(`<?xml version="1.0" encoding="UTF-8" ?>`)
        return
      }

      // 防止 parse 报错
      let data = []
      try {
        data = JSON.parse(body).body || []
      } catch (error) {
        data = []
      }
      const urls = data.map(item =>
        `<url>
          <loc>https://www.123.cn${item.url}</loc>
          <lastmod>${item.time}</lastmod>
          <changefreq>daily</changefreq>
          <priority>0.8</priority>
        </url>`
      )
      const xml =
        `<?xml version="1.0" encoding="UTF-8" ?>
          <urlset>
            ${urls.join('')}
          </urlset>`
      res.type('application/xml')
      res.status(200).send(xml)
    })
  } else {
    next()
  }
})


/* 全局错误抛出 */
app.use((error, req, res, next) => {
  if (error) {
    console.log('全局错误抛出:', error)
  }
})
async function start () {
  // Init Nuxt.js
  const nuxt = new Nuxt(config)
  const { host, port } = nuxt.options.server
  if (isBuild) {
    const builder = new Builder(nuxt)
    await builder.build()
    consola.success({
      message: `打包完毕!`,
      badge: true
    })
    return
  }
  // Build only in dev mode
  if (isDev) {
    const builder = new Builder(nuxt)
    await builder.build()
  } else {
    await nuxt.ready()
  }
  // Give nuxt middleware to express
  app.use(nuxt.render)
  // Listen the server
  app.listen(port, host)
  // 拦截“未捕获的异常”
  process.on('uncaughtException'function (err) {
    console.log('未捕获的异常:', err)
  })
  consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true
  })
}
start()


每次搜索引擎请求 https://www.xxx.com/sitemap.xml 的时候,就会获取最新的数据列表,然后生成最新的 sitemap.xml。 这样能够让搜索引擎更快,更全面地获取到网站想要被抓取的网页地图。

    评论列表

  • 暂无评论...快来说说吧!
person
0 / 16
comment
0 / 100