求助:Handlebars模板无法访问数组内数据的问题
问题解决指南
核心问题:模板遍历路径错误
API返回的JSON结构中,新闻数组嵌套在content字段下,你当前的模板直接遍历obj(根对象),自然无法访问到数组内的title等字段。
修改Handlebars模板
将遍历目标改为obj.content,同时如果需要渲染HTML格式的content字段,要使用三个大括号{{{}}}避免HTML转义:
{{#each obj.content}} <article> <h2>{{title}}</h2> <time>{{date}}</time> {{{content}}} </article> {{/each}}
路由代码的优化与修复
你的路由存在两个潜在问题:异步逻辑顺序错误、缺少错误防护,会导致渲染异常或程序崩溃:
修改后的路由代码
router.get('/news', function(req, res) { const url = 'https://financialmodelingprep.com/api/v3/fmp/articles?page=0&size=5&apikey=apikey'; request(url, function(error, response, results) { // 先处理请求错误 if (error || response.statusCode !== 200) { return res.status(500).send('获取新闻数据失败'); } try { const obj = JSON.parse(results); // 优先渲染视图,不等待文件保存(文件保存是额外操作) res.render('news', { obj }); // 异步保存文件,不阻塞响应 fs.writeFile('data/news/news.json', results, function(err) { if (err) { console.error('保存新闻文件失败:', err); } else { console.log('新闻已保存到 news.json'); } }); } catch (parseErr) { // 处理JSON解析错误 console.error('解析JSON数据失败:', parseErr); return res.status(500).send('处理新闻数据失败'); } }); });
代码修改说明
- 调整异步逻辑顺序:将视图渲染放在文件保存操作之前,用户无需等待文件写入完成就能看到页面,同时文件保存的错误不会影响页面渲染。
- 增加错误防护:用
try-catch包裹JSON.parse,避免API返回非JSON格式数据导致程序崩溃;提前判断请求状态码和错误,及时返回错误响应。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

