var express = require('express'); var router = express.Router(); const models = require('../../models'); const common = require('./common'); const redis = require('../../libs/redis'); const { coloringData } = require('./config'); const { getListBuilder } = require('../../libs/pager'); const CACHE_PREFIX = "art_v2"; // const CACHE_EXPIRES = 60; // 60s刷新一次 const CACHE_EXPIRES = 600; router.get('/', process()); function process() { return (req, res, next) => { (async function () { let uri = req.baseUrl.substring(1); let cacheKey = `${CACHE_PREFIX}_${uri}`; let htmlData = await redis.getAsync(cacheKey); // htmlData = null; if (!htmlData) { if (!coloringData[uri].data) { let query = { orderBy: 'publishTime', order: 'desc', base: { status: 9000 }, filters: { _id: coloringData[uri].list }, } let result = await getListBuilder(query, models.Art, [{ path: 'user', select: 'username' }]); common.organizeData(result.data); coloringData[uri].data = result.data; } const comments = await models.Comment.find({ approved: true, page: coloringData[uri].title }).sort({ createdAt: -1 }); let data = { uri: req.originalUrl, data: coloringData[uri], pageId: coloringData[uri].title, comments, dateFormat: common.dateFormat, }; // 渲染EJS模板到内存中 res.render('v2/coloring-page-collection', data, async (err, html) => { if (err) { // 如果渲染出错,调用next()传递错误 return next(err); } // 渲染成功,存redis, 发送数据到客户端 htmlData = html; try { await redis.set(cacheKey, htmlData, 'EX', CACHE_EXPIRES); } catch (e) { console.error(e); } res.send(htmlData); }); } else { // 缓存命中, 直接发送缓存数据 res.set({ 'X-From-Cache': 'true' }); res.send(htmlData); } })().catch(next); } } module.exports = router;