video-coloring-page.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. var express = require('express');
  2. var router = express.Router();
  3. const models = require('../../models');
  4. const common = require('./common');
  5. const redis = require('../../libs/redis');
  6. const config = require('../../config/app');
  7. const CACHE_PREFIX = "art_v2";
  8. // const CACHE_EXPIRES = 60; // 60s刷新一次
  9. const CACHE_EXPIRES = 600;
  10. router.get('/', (req, res, next) => {
  11. (async function () {
  12. let uri = req.originalUrl.substring(1);
  13. let cacheKey = `${CACHE_PREFIX}_video-coloring-pages`;
  14. let htmlData = await redis.getAsync(cacheKey);
  15. htmlData = null;
  16. if (!htmlData) {
  17. let videos = await models.ArtVideoStory
  18. .find({ enabled: true, seoTitle: { $exists: true } })
  19. .populate({ path: 'contents', model: 'Art', select: 'name title width height date publishTime tags lastMod publishVersion' })
  20. .sort({ order: 'asc' })
  21. .lean()
  22. .exec();
  23. let host = config.cdnHost ?? config.resHost;
  24. for (let doc of videos) {
  25. doc.poster = `${host}/thumbs/coloring-page/vs-poster/320/${doc._id}.webp`;
  26. doc.size = doc.contents.length;
  27. if (doc.seoTitle) {
  28. try {
  29. let titleJson = JSON.parse(doc.seoTitle);
  30. doc.seoTitle = titleJson && titleJson['en'] ? titleJson['en'] : doc.name;
  31. } catch (e) {
  32. console.error(e.message);
  33. }
  34. } else {
  35. doc.seoTitle = doc.name;
  36. }
  37. if (doc.seoDescription) {
  38. try {
  39. let descJson = JSON.parse(doc.seoDescription);
  40. doc.seoDescription = descJson && descJson['en'] ? descJson['en'] : doc.seoTitle;
  41. } catch (e) {
  42. console.error(e.message);
  43. }
  44. } else {
  45. doc.seoDescription = doc.seoTitle;
  46. }
  47. common.organizeData(doc.contents);
  48. delete doc.seoDescription;
  49. let jsonStr = JSON.stringify(doc, (key, value) => {
  50. if (key == 'seoTitle' || key == 'seoDescription') {
  51. value = value.replace(/"/g, '\\\"');
  52. }
  53. return value;
  54. });
  55. doc.jsonStr = jsonStr;
  56. }
  57. pageId = 'Video Coloring Pages';
  58. const comments = await models.Comment.find({ approved: true, page: pageId }).sort({ createdAt: -1 });
  59. let data = {
  60. uri: req.originalUrl,
  61. data: videos,
  62. pageId,
  63. comments,
  64. dateFormat: common.dateFormat,
  65. };
  66. // 渲染EJS模板到内存中
  67. res.render('v2/video-coloring-pages', data, async (err, html) => {
  68. if (err) {
  69. // 如果渲染出错,调用next()传递错误
  70. return next(err);
  71. }
  72. // 渲染成功,存redis, 发送数据到客户端
  73. htmlData = html;
  74. try {
  75. await redis.set(cacheKey, htmlData, 'EX', CACHE_EXPIRES);
  76. } catch (e) {
  77. console.error(e);
  78. }
  79. res.send(htmlData);
  80. });
  81. } else {
  82. // 缓存命中, 直接发送缓存数据
  83. res.set({ 'X-From-Cache': 'true' });
  84. res.send(htmlData);
  85. }
  86. })().catch(next);
  87. });
  88. module.exports = router;