You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EJS+Express+Axios点击按钮展示API JSON数据遇显示问题求助

EJS展示API JSON数据问题排查指引

问题描述

我尝试用EJS展示API返回的JSON数据,通过Axios获取数据。已经编写server.js负责获取数据和渲染页面,以及index.ejs和loaded.ejs两个页面:index页面仅包含一个按钮,点击后需将JSON数据展示到loaded页面,但loaded页面要么显示空白,要么显示[object Object],求问题排查指引。

当前代码

Server.js

// required module to make calls to a REST API
const axios = require('axios');
// 注意:原代码缺失express和bodyParser的完整引入,需补充
// const express = require('express');
// const bodyParser = require('body-parser');
// const app = express();

app.use(bodyParser.urlencoded({ extended: true }));

// set the view engine to ejs
app.set('view engine', 'ejs');

// index page 
app.get('/', function(req, res) {
    res.render("pages/index.ejs", {});
});

app.post('/process_form', function(req, res){
    var url = "https://statsapi.web.nhl.com/api/v1/teams";
    axios.get(url)
        .then((response)=>{
            let teams = response.data;
            res.render('pages/loaded.ejs', {
                team: teams
            });
        });
  })

app.listen(8080);
console.log('8080 is the magic port');

Index.ejs

<header>
    
</header>

<main>
<div>
    <form action="/process_form" method="post">
        <h2>Click button below to show Hockey Teams</h2>
        <div class="form-group">
            <input class="btn btn-lg btn-primary btn-block" type="submit">
        </div>
    </form>
</div>
</main>

<footer>

</footer>

Loaded.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <%- include('../partials/head'); %>

</head>
<body class="container">

    <header>
        
    </header>

    <main>
        <% if (locals.team) { %>
            <p> <%= team %> </p>
        <% } %>

    </main>

    <footer>
        
    </footer>

</body>
</html>

排查与解决步骤

1. 补全server.js的核心依赖引入

原代码缺失express的初始化代码,这会导致服务器无法正常启动,直接引发空白页面问题。需补充以下代码在最顶部:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

2. 确认API数据结构并修正数据传递

NHL的API返回的是包含teams数组的对象(结构类似{ teams: [...] }),你当前传递的是整个response.data对象,直接输出会显示[object Object]。
修改server.js中的axios回调:

axios.get(url)
    .then((response)=>{
        // 提取实际的球队数组
        let teamsList = response.data.teams;
        res.render('pages/loaded.ejs', {
            teams: teamsList // 将数组传给模板
        });
    })
    // 添加错误处理,避免请求失败时页面空白
    .catch(error => {
        console.error('API请求失败:', error);
        res.render('pages/loaded.ejs', { 
            errorMsg: '获取球队数据失败,请稍后重试' 
        });
    });

3. 修改loaded.ejs的渲染逻辑

模板中需要遍历球队数组,而不是直接输出对象。同时增加错误提示:

<main>
    <% if (locals.errorMsg) { %>
        <p style="color: red;"><%= errorMsg %></p>
    <% } else if (locals.teams && teams.length > 0) { %>
        <ul>
            <% teams.forEach(team => { %>
                <li><%= team.name %>(简称:<%= team.abbreviation %>)</li>
            <% }) %>
        </ul>
    <% } else { %>
        <p>暂无球队数据</p>
    <% } %>
</main>

4. 验证数据传递是否正常

在server.js的axios回调中添加console.log(response.data.teams),启动服务器后点击按钮,查看终端输出的数组结构,确认数据是否正确获取。

内容的提问来源于stack exchange,提问作者Zion994

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:50