coloring-page-collection.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 { coloringData } = require('./config');
  7. const { getListBuilder } = require('../../libs/pager');
  8. const CACHE_PREFIX = "art_v2";
  9. // const CACHE_EXPIRES = 60; // 60s刷新一次
  10. const CACHE_EXPIRES = 600;
  11. router.get('/', process());
  12. function process() {
  13. return (req, res, next) => {
  14. (async function () {
  15. let uri = req.baseUrl.substring(1);
  16. let cacheKey = `${CACHE_PREFIX}_${uri}`;
  17. let htmlData = await redis.getAsync(cacheKey);
  18. // htmlData = null;
  19. if (!htmlData) {
  20. if (!coloringData[uri].data) {
  21. let query = {
  22. orderBy: 'publishTime',
  23. order: 'desc',
  24. base: { status: 9000 },
  25. filters: { _id: coloringData[uri].list },
  26. }
  27. let result = await getListBuilder(query, models.Art, [{ path: 'user', select: 'username' }]);
  28. common.organizeData(result.data);
  29. coloringData[uri].data = result.data;
  30. }
  31. const comments = await models.Comment.find({ approved: true, page: coloringData[uri].title }).sort({ createdAt: -1 });
  32. let data = {
  33. uri: req.originalUrl,
  34. data: coloringData[uri],
  35. pageId: coloringData[uri].title,
  36. comments,
  37. dateFormat: common.dateFormat,
  38. };
  39. // 渲染EJS模板到内存中
  40. res.render('v2/coloring-page-collection', data, async (err, html) => {
  41. if (err) {
  42. // 如果渲染出错,调用next()传递错误
  43. return next(err);
  44. }
  45. // 渲染成功,存redis, 发送数据到客户端
  46. htmlData = html;
  47. try {
  48. await redis.set(cacheKey, htmlData, 'EX', CACHE_EXPIRES);
  49. } catch (e) {
  50. console.error(e);
  51. }
  52. res.send(htmlData);
  53. });
  54. } else {
  55. // 缓存命中, 直接发送缓存数据
  56. res.set({ 'X-From-Cache': 'true' });
  57. res.send(htmlData);
  58. }
  59. })().catch(next);
  60. }
  61. }
  62. module.exports = router;