首先先安装 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。 这样能够让搜索引擎更快,更全面地获取到网站想要被抓取的网页地图。
©2018-2020 hongshali.com 版权所有 ICP证:闽ICP备18029655号-1