app.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. const config = require('./config')
  2. const express = require('express')
  3. const status = require('http-status')
  4. const cors = require('cors')
  5. const xss = require('xss-clean')
  6. const app = express()
  7. const fs = require('fs')
  8. const path = require('path')
  9. const axios = require('axios').default
  10. const fetch = axios.create()
  11. // parse json request body
  12. app.use(express.json())
  13. // parse urlencoded request body
  14. app.use(express.urlencoded({ extended: true }))
  15. // sanitize request data
  16. app.use(xss())
  17. app.use(express.static(config.template))
  18. app.get('/view', (req, res, next) => {
  19. let num = req.query.m
  20. if (num) {
  21. const view = path.join(config.template, 'view.html')
  22. return fetch
  23. .get(`https://test.4dkankan.com/scene/data/data${num}/scene.json?_=${Date.now()}`)
  24. .then(response => {
  25. if (response.status >= 200 && response.status <= 400) {
  26. fs.access(view, err => {
  27. if (err) {
  28. res.statusCode = status.INTERNAL_SERVER_ERROR
  29. res.end()
  30. console.error(err)
  31. } else {
  32. fs.readFile(view, (err, html) => {
  33. if (err) {
  34. res.statusCode = status.INTERNAL_SERVER_ERROR
  35. res.end()
  36. console.error(err)
  37. } else {
  38. const description = response.data.sceneDec.replace(/<[^>]+>/gi, '')
  39. html = html.toString()
  40. html = html.replace('<title></title>', `<title>${response.data.sceneName}</title>`)
  41. html = html.replace('<meta name="description">', `<meta name="description" content="${description}">`)
  42. html = html.replace('<meta property="og:title">', `<meta property="og:title" content="${response.data.sceneName}">`)
  43. html = html.replace('<meta property="og:description">', `<meta property="og:description" content="${description}">`)
  44. html = html.replace('<meta property="og:url">', `<meta property="og:url" content="${response.data.webSite}">`)
  45. html = html.replace('<meta property="og:site_name">', `<meta property="og:site_name" content="4DKanKan">`)
  46. html = html.replace('<meta property="og:image">', `<meta property="og:image" content="https://4dkk.4dage.com/images/images${num}/thumbBigImg.jpg">`)
  47. html = html.replace(
  48. '<meta property="og:image:secure_url">',
  49. `<meta property="og:image:secure_url" content="https://4dkk.4dage.com/images/images${num}/thumbBigImg.jpg">`
  50. )
  51. html = html.replace('<meta property="og:image:type">', `<meta property="og:image:type" content="image/jpeg">`)
  52. html = html.replace('<meta property="og:image:width">', `<meta property="og:image:width" content="700">`)
  53. html = html.replace('<meta property="og:image:height">', `<meta property="og:image:width" content="350">`)
  54. html = html.replace('window.__KANKAN_DATA = null', 'window.__KANKAN_DATA = ' + JSON.stringify(response.data))
  55. res.end(html)
  56. }
  57. })
  58. }
  59. })
  60. } else {
  61. next()
  62. }
  63. })
  64. .catch(err => {
  65. res.statusCode = err.response.status
  66. res.end()
  67. })
  68. }
  69. res.statusCode = status.NOT_FOUND
  70. res.end()
  71. })
  72. if (config.env == 'development') {
  73. // enable cors
  74. app.use(cors())
  75. app.options('*', cors())
  76. }
  77. const logger = {
  78. info(msg) {
  79. console.log(msg)
  80. },
  81. error(msg) {
  82. console.log(msg)
  83. },
  84. }
  85. const server = app.listen(config.port, () => {
  86. logger.info(`Listening to port ${config.port}`)
  87. })
  88. const exitHandler = () => {
  89. if (server) {
  90. server.close(() => {
  91. logger.info('Server closed')
  92. process.exit(1)
  93. })
  94. } else {
  95. process.exit(1)
  96. }
  97. }
  98. const unexpectedErrorHandler = error => {
  99. logger.error(error)
  100. exitHandler()
  101. }
  102. process.on('uncaughtException', unexpectedErrorHandler)
  103. process.on('unhandledRejection', unexpectedErrorHandler)
  104. process.on('SIGTERM', () => {
  105. logger.info('SIGTERM received')
  106. if (server) {
  107. server.close()
  108. }
  109. })