当前位置: 首页 > news >正文

nuxt3持久化存储全局变量

最近有一个项目,全部数据给的是json文件,大量json文件的读取导致IO读取爆表,但是不给提供数据库

现有解决办法就是把所有文件在项目构建时,读取存为全局变量,缓存在内存里,减轻I/O压力

server/plugins/apps.ts 中获取的数据会存在内存中

这是因为:

  1. 该文件中定义的变量是在模块级别定义的,它的生命周期会持续到服务器运行期间。
  2. 当使用 defineNitroPlugin 时,这个插件会在服务器启动时执行一次,将数据加载到 appsData 变量中
  3. 在 Node.js 中,模块级别的变量会被缓存,并且在整个服务器运行期间保持存在。
  4. 在 Nuxt3 的 Nitro 服务器中,defineNitroPlugin 确保了这个初始化过程只会在服务器启动时执行一次。

实现步骤:

server/plugins/app.ts

// 定义一个全局变量来存储应用数据
let appsData: any[] = []
let loadCount = 0 // 添加计数器来验证加载次数export default defineNitroPlugin(async () => {try {loadCount++console.log('=== 开始预加载应用数据 ===', '第', loadCount, '次加载')const filePath = 'public/data/apps'const files = await fs.readdir(filePath)console.log('===找到文件:', files.length, '条文件 ===')const apps = await Promise.all(files.map(async file => {const content = await fs.readFile(path.join(filePath, file), 'utf8')return JSON.parse(content)}))// 将所有应用数据合并并存储到全局变量中appsData = apps.flat()console.log('=== 应用数据预加载完成,共加载', appsData.length, '条数据 ===')} catch (error) {console.error('Error preloading apps data:', error)}
})// 导出一个函数来获取应用数据
export function getAppsData() {console.log('---从内存中获取应用数据,当前数据条数:', appsData.length, '---')return appsData
} 

调用方法

server/api/app/[slug].get.ts

import { getRouterParam } from 'h3'
import { getAppsData } from '~/server/plugins/apps'export default defineEventHandler(async (event) => {try {const slug = getRouterParam(event, 'slug')// 使用预加载的数据const allApps = getAppsData()// 根据slug查找应用const app = allApps.find(app => app.slug === slug)return app} catch (error) {console.error('Error finding app:', error)return null}
}) 
http://www.xdnf.cn/news/121645.html

相关文章:

  • 【深度学习核心技术解析】从理论到实践的全链路指南
  • 【Python解释器】Pycharm中找不到Python打包工具-解决办法
  • 优化Nginx的下载功能
  • EFISH-SBC-RK3588无人机地面基准站项目
  • Spring 中@Autowired,@Resource,@Inject 注解实现原理
  • 中间系统-SPF计算
  • 如何规避矩阵运营中的限流风险及解决方案
  • 如何测试短信接口
  • Java String对象创建过程
  • 如何借助ETL数据集成工具实现数据一致性?
  • 腾讯云服务器安全——服务防火墙端口放行
  • 【棒球运动】户外运动安全技巧·棒球1号位
  • 多头注意力
  • Redis-缓存应用 本地缓存与分布式缓存的深度解析
  • React 的 useEffect 清理函数详解
  • MCP servers源码详细解析
  • 把dll模块注入到游戏进程的方法_挂起进程注入
  • AOSP CachedAppOptimizer 冻结方案
  • 项目——高并发内存池
  • (八)深入了解AVFoundation-采集:拍照功能的实现
  • Java学习手册:TCP 协议基础
  • Python函数与模块笔记
  • arm64适配系列文章-第十章-arm64环境上jenkins的部署
  • 热度大幅度下降,25西电经济与管理学院(考研录取情况)
  • git检查提交分支和package.json的version版本是否一致
  • 【Axure教程】表格嵌套卡片
  • 什么是公链?公链项目有哪些?公链项目开发
  • Axure疑难杂症:母版菜单设置打开链接后菜单选中效果
  • css3新特性第七章(3D变换)
  • ITL和TTL线程间值的传递