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

如何将Node.js从API抓取的数据填充到EJS模板并展示名称与价格

问题原因

fetchData是异步函数,直接调用会返回Promise实例而非实际接口数据,你没有等待异步请求完成就把Promise传给了EJS模板,所以页面会渲染[object Promise]。

第一步:修改index.js代码

你需要给路由处理函数加上async/await等待异步请求完成,同时提取axios返回结果里的实际接口数据:

const express = require("express");
const app = express();
const path = require("path");
const axios = require("axios").default;
const cors = require("cors");
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "/views"));

app.use(
  cors({
    origin: "http://localhost:3000",
  })
);

const fetchData = async () => {
  const response = await axios.get(
    "https://nepse-data-api.herokuapp.com/data/todaysprice"
  );
  // 直接返回接口实际返回的数组数据
  return response.data;
};

// 路由处理函数加async关键字
app.get("/", async (req, res) => {
  try {
    // 等待异步请求完成拿到实际数据
    const nepseData = await fetchData();
    res.render("home.ejs", { nepseData });
  } catch (err) {
    // 错误处理,避免接口请求失败导致服务崩溃
    console.error("请求数据失败:", err);
    res.render("home.ejs", { nepseData: [], error: "数据加载失败" });
  }
});

app.listen(3000, () => {
  console.log("listening to port 3000");
});

第二步:修改home.ejs代码

接口返回的是数组格式的数据,你可以通过循环遍历渲染每一项的名称和价格字段(示例假设名称字段为companyName,价格字段为closingPrice,你可以根据API实际返回的字段名替换):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style>
    table { border-collapse: collapse; width: 80%; margin: 20px auto; }
    th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
    th { background-color: #f2f2f2; }
  </style>
</head>
<body>
  <% if (error) { %>
    <p style="color: red; text-align: center;"><%= error %></p>
  <% } else { %>
    <table>
      <thead>
        <tr>
          <th>股票名称</th>
          <th>收盘价格</th>
        </tr>
      </thead>
      <tbody>
        <% for(let item of nepseData) { %>
        <tr>
          <td><%= item.companyName %></td>
          <!-- 替换为实际的价格字段名即可 -->
          <td><%= item.closingPrice %></td>
        </tr>
        <% } %>
      </tbody>
    </table>
  <% } %>
</body>
</html>

字段调整说明

如果实际API返回的名称、价格字段和示例不一致,只需要替换item.companyName和item.closingPrice为实际字段名即可正常渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:06:04