如何使用Hapi Server Methods实现自动补全的栈缓存并返回弹出元素?
基于Hapi实现自动补充的数字分配服务
完全可以实现这个需求,核心是维护一个全局缓存队列,搭配并发锁避免重复调用getNumbers API,以下是具体实现方案:
核心思路
- 用全局数组存储缓存的数字,每次请求取出并移除队首元素
- 加一个并发锁变量,防止多个请求同时触发
getNumbers调用(避免重复补充缓存) - 当缓存为空时,自动调用
getNumbersAPI填充缓存
完整代码示例
const Hapi = require('@hapi/hapi'); // 全局缓存:存储可用的数字 let numberCache = []; // 并发锁:标记是否正在补充缓存,防止重复调用API let isRefreshing = false; // 模拟外部getNumbers API,实际场景替换为真实请求逻辑 async function getNumbers(X = 5) { // 这里模拟生成递增的唯一数字,实际调用外部API即可 const lastNum = numberCache.length ? numberCache[numberCache.length - 1] : 111; return Array.from({ length: X }, (_, i) => lastNum + 111 * (i + 1)); } // 补充缓存的逻辑 async function refreshCache() { if (isRefreshing) return; isRefreshing = true; try { const newNumbers = await getNumbers(); numberCache.push(...newNumbers); } catch (err) { console.error('补充缓存失败:', err); } finally { isRefreshing = false; } } // 获取下一个可用数字的核心函数 async function getNextNumber() { // 缓存为空时先补充 if (numberCache.length === 0) { await refreshCache(); } // 取出并移除队首元素 return numberCache.shift(); } // 初始化Hapi服务 const init = async () => { const server = Hapi.server({ port: 3000, host: 'localhost' }); // 注册请求路由 server.route({ method: 'GET', path: '/get-number', handler: async (request, h) => { const number = await getNextNumber(); return { number }; } }); await server.start(); console.log('服务运行地址:%s', server.info.uri); }; // 处理未捕获的异常 process.on('unhandledRejection', (err) => { console.error(err); process.exit(1); }); init();
关键细节说明
- 并发锁控制:
isRefreshing变量确保同一时间只有一个请求触发getNumbers调用,避免缓存重复填充 - 缓存补充逻辑:
refreshCache函数用try/finally保证锁一定会被释放,不会导致后续请求无法补充缓存 - 请求处理流程:每次请求进入
/get-number路由后,先检查缓存状态,空则自动补充,再返回队首数字并移除
测试方式
启动服务后,多次请求http://localhost:3000/get-number,会依次返回111、222...555,缓存耗尽后自动调用getNumbers补充,继续返回666、777等数字。
内容的提问来源于stack exchange,提问作者user1092481290841204
相关产品推荐
相关产品推荐

