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

如何在Express项目中让所有EJS模块共享JSON文件数据?

解决方案:让JSON数据在Express+EJS项目全局可用并正确渲染

你目前遇到的核心问题有两个:一是没把JSON数据全局传递给所有EJS视图,二是header.ejs里的变量引用路径错误。下面一步步帮你解决:

1. 把JSON数据挂载为全局视图变量

你已经在app.js里读取了JSON数据,但还需要将其挂载到Express的app.locals对象上——这个对象里的属性会自动成为所有EJS模板的全局变量,不用在每个路由里重复传递。

修改你的app.js代码:

'use strict';
const express = require('express');
const app = express();
// 可以用更简洁的方式加载JSON,require会自动解析JSON格式
const siteData = require('./data.json');

// 将数据挂载到app.locals,让所有模板都能访问
app.locals.siteData = siteData;

// 后续的中间件、路由配置...

2. 修正header.ejs里的变量引用

你之前的模板里写了data.data.menu[i].title,这是错误的路径。现在我们把数据挂载到了siteData全局变量下,直接引用它即可:

修改后的header.ejs:

<ul class="menu-list">
  <% siteData.menu.forEach(item => { %>
  <li><a href="<%= item.link %>"><%= item.title %></a></li>
  <% }) %>
</ul>

如果习惯用for循环也可以:

<ul class="menu-list">
  <% for(let i = 0; i < siteData.menu.length; i++) { %>
  <li><a href="<%= siteData.menu[i].link %>"><%= siteData.menu[i].title %></a></li>
  <% } %>
</ul>

3. 路由代码无需额外修改(可选补充)

你的index.js路由代码保持原样即可,因为全局变量siteData会自动注入到模板上下文里。如果需要传递页面专属数据(比如title),直接正常传递就行,两者互不影响:

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Bank' });
});

module.exports = router;

额外小提示

  • 用require('./data.json')加载JSON比fs.readFileSync更简洁,而且是同步加载,适合启动时读取配置类数据;
  • 确保data.json的路径正确,如果它不在app.js同级目录,要写对相对路径(比如./config/data.json)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:52:33