使用Express获取URL JSON渲染EJS页面时遇Cannot GET /错误求助
解决Express应用中“Cannot GET /”错误及数据渲染问题
看起来你在从原生Node.js转用Express的过程中遇到了两个核心问题:一是根路由无法正常响应(出现“Cannot GET /”),二是JSON数据无法正确渲染到EJS页面。我帮你一步步排查和修复:
1. 先解决“Cannot GET /”的核心问题
你的代码里有个关键问题:Express 4.x已经移除了内置的express.errorHandler()方法,但你还在错误处理中间件里调用它,这会导致应用启动时就抛出错误,进而无法正常处理根路由的请求。
修复步骤:
- 首先安装专门的错误处理模块(仅在开发环境使用):
npm install errorhandler --save-dev - 修改app.js里的错误处理部分:
// 先引入errorhandler模块 var errorHandler = require('errorhandler'); // 替换原来的错误处理逻辑 if (app.get('env') === 'development') { // 开发环境用errorhandler展示详细错误 app.use(errorHandler()); } else { // 生产环境返回通用错误提示 app.use(function(err, req, res, next) { res.status(500).send('Internal Server Error'); }); }
2. 确保路由逻辑正常工作
你的路由挂载顺序是对的,但可以给request请求增加日志和错误捕获,方便排查API请求是否成功:
修改router.get('/')的回调函数:
router.get('/', function(req, res, next) { request('http://public.api.openprocurement.org/api/2.4/tenders?offset=2018-01-05T21:02:46.167030+02:00', function (err, response, body) { // 捕获请求本身的错误 if (err) { console.error('请求API时出错:', err); return res.status(500).send('获取数据失败,请检查API链接'); } // 检查API响应状态码 if (response.statusCode !== 200) { console.error('API响应状态异常:', response.statusCode); return res.status(500).send(`API返回状态码:${response.statusCode}`); } // 捕获JSON解析错误 try { const newsData = JSON.parse(body); res.render('index', { title : 'Main page', news : newsData, some: '<b>Hello</b>' }); } catch (parseErr) { console.error('解析JSON数据出错:', parseErr); return res.status(500).send('解析数据失败'); } }); });
3. 修复EJS模板的渲染问题
你当前的EJS代码<%-news%>直接输出JSON对象,页面上只会显示[object Object],需要把对象转为格式化的JSON字符串才能正常展示:
修改你的EJS模板文件:
<h1><%= title %></h1> <h2>API返回的JSON数据:</h2> <!-- 使用JSON.stringify把对象转为格式化的字符串,pre标签保留格式 --> <pre><%= JSON.stringify(news, null, 2) %></pre> <h2>富文本示例:</h2> <%- some %>
最后验证
完成以上修改后,重启你的Express应用:
- 如果API请求正常,页面会显示格式化的JSON数据和加粗的“Hello”;
- 如果API请求失败,控制台会输出详细错误信息,页面也会有对应的提示,方便你进一步排查。
内容的提问来源于stack exchange,提问作者Vladyslav Tereshyn
相关产品推荐
相关产品推荐

