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

如何使用Hapi Server Methods实现自动补全的栈缓存并返回弹出元素?

基于Hapi实现自动补充的数字分配服务

完全可以实现这个需求,核心是维护一个全局缓存队列,搭配并发锁避免重复调用getNumbers API,以下是具体实现方案:

核心思路

  • 用全局数组存储缓存的数字,每次请求取出并移除队首元素
  • 加一个并发锁变量,防止多个请求同时触发getNumbers调用(避免重复补充缓存)
  • 当缓存为空时,自动调用getNumbers API填充缓存

完整代码示例

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();

关键细节说明

  1. 并发锁控制:isRefreshing变量确保同一时间只有一个请求触发getNumbers调用,避免缓存重复填充
  2. 缓存补充逻辑:refreshCache函数用try/finally保证锁一定会被释放,不会导致后续请求无法补充缓存
  3. 请求处理流程:每次请求进入/get-number路由后,先检查缓存状态,空则自动补充,再返回队首数字并移除

测试方式

启动服务后,多次请求http://localhost:3000/get-number,会依次返回111、222...555,缓存耗尽后自动调用getNumbers补充,继续返回666、777等数字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:05:22