如何使用Vercel KV在Node.js Express API中缓存MongoDB帖子
集成Vercel KV实现Express API缓存
步骤1:安装Vercel KV依赖
先安装官方KV客户端包:
npm install @vercel/kv
步骤2:初始化Vercel KV客户端
在项目中创建KV客户端实例(可单独写在kv.js文件,或直接在路由文件引入):
import { createClient } from '@vercel/kv'; const kv = createClient({ url: process.env.KV_URL, token: process.env.KV_REST_API_TOKEN, });
本地开发时,需在.env文件添加Vercel控制台提供的KV环境变量:
KV_URL=你的KV数据库URL KV_REST_API_TOKEN=你的KV API令牌
步骤3:修改接口实现缓存逻辑
更新原/posts路由,优先从缓存取数据,未命中再查MongoDB并写入缓存:
router.get('/posts', async (req, res) => { try { const page = Number(req.query.page) || 1; const limit = Number(req.query.limit) || 50; // 生成唯一缓存键,区分不同分页请求 const cacheKey = `posts:page:${page}:limit:${limit}`; // 1. 尝试从Vercel KV获取缓存 const cachedPosts = await kv.get(cacheKey); if (cachedPosts) { return res.json(JSON.parse(cachedPosts)); } // 2. 缓存未命中,查询MongoDB const skip = (page - 1) * limit; const result = await User.aggregate([ { $project: { posts: 1 } }, { $unwind: '$posts' }, { $project: { postImage: '$posts.post', date: '$posts.date' } }, { $sort: { date: -1 } }, { $skip: skip }, { $limit: limit }, ]); // 3. 将结果存入缓存,设置1小时过期(可按需调整) await kv.set(cacheKey, JSON.stringify(result), { ex: 3600 }); res.json(result); } catch (err) { console.error(err); res.status(500).json({ message: 'Internal server error' }); } });
关键细节
- 缓存键设计:用
posts:page:X:limit:Y格式,避免不同分页请求的缓存互相覆盖。 - 过期时间:通过
ex: 3600设置缓存1小时后自动失效,防止数据长期过期。 - 序列化处理:Vercel KV仅支持字符串存储,所以存数据时转JSON字符串,取数据时再解析。
内容的提问来源于stack exchange,提问作者cwecae
相关产品推荐
相关产品推荐

