.ejs文件缓存失效:根路径服务器无响应如何修复?
问题解决:Node-Cache缓存EJS文件后根路径无响应
问题场景
使用node-cache实现EJS文件缓存时,服务器对根路径/无响应,当前代码如下:
app.get('/', (req, res) => { if(myCache.has('/')){ console.log('Getting it from cache....') return res.send(myCache.get('/')) }else{ let htmlStr = ''; res.renderFile('index', {title: 'ReSt ApI'}, (err, html) => { if(err){ console.log('Error'); } else{ htmlStr = html; myCache.set('/', htmlStr) res.send(htmlStr); } }) } })
对比可正常工作的纯HTML文件路由:
app.get('/', (req, res) => { if(myCache.has('/')){ console.log('Getting it from cache') return res.sendFile(myCache.get('/')) } else{ myCache.set('/', path.resolve(__dirname, 'client', 'index.html')) res.sendFile(path.resolve(__dirname, 'client', 'index.html')) } })
问题原因及修复方案
核心问题
- 错误未处理响应:当
res.renderFile执行出错时,仅打印错误但未向客户端返回任何响应,导致请求一直处于挂起状态,服务器无响应。 - EJS文件路径不明确:若未配置EJS视图目录,直接写
'index'可能找不到文件,需指定完整路径。
修改后的代码
const path = require('path'); app.get('/', (req, res) => { if(myCache.has('/')){ console.log('Getting it from cache....') return res.send(myCache.get('/')) }else{ // 指定EJS文件的完整路径,避免找不到文件 const ejsFilePath = path.resolve(__dirname, 'views', 'index.ejs'); res.renderFile(ejsFilePath, {title: 'ReSt ApI'}, (err, html) => { if(err){ console.error('渲染EJS出错:', err); // 出错时返回500错误及提示,确保响应结束 return res.status(500).send('页面渲染失败'); } myCache.set('/', html); res.send(html); }) } })
关键修改点
- 添加错误响应:出错时调用
res.status(500).send()返回错误信息,确保请求被正常处理并结束。 - 指定完整EJS路径:使用
path.resolve拼接完整的EJS文件路径,避免因视图目录未配置导致的文件找不到问题。 - 移除冗余变量:直接使用回调中的
html变量,无需额外定义htmlStr。
内容的提问来源于stack exchange,提问作者user25025825
相关产品推荐
相关产品推荐

