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

能否在Deno Supabase边缘函数中使用Node.js的web-push库?

能否在Deno Supabase边缘函数中使用Node.js的web-push库?

没问题,我来帮你梳理这个问题——你确实可以在Deno Supabase边缘函数里使用web-push库,但得避开一些坑,下面给你拆解清楚:

一、能不能用?

答案是肯定的,但不能直接用Node.js原生版本的库,得用适配Deno的ESM分发版本(比如你尝试的jspm CDN链接就是可行方向,esm.sh这类CDN对Deno的兼容性会更可靠)。

二、为什么你的当前代码不工作?

问题出在webpush.setGCMAPIKey('<The GCM API Key>')这一行:

  • GCM(现在叫FCM)API Key是web-push库的旧版兼容方案,现代浏览器和推送服务已经普遍支持VAPID认证,这个配置其实已经不是必需的了。
  • Supabase边缘函数运行在Deno的受限沙箱环境中,这行代码可能依赖了Node.js特有的API,或者触发了边缘函数不允许的网络请求逻辑,直接导致了超时。

三、怎么让它正常工作?

按照以下步骤调整代码即可:

1. 移除无效的GCM API Key配置

直接删掉webpush.setGCMAPIKey(...)这一行,VAPID认证已经足够覆盖主流推送场景。

2. 改用更稳定的Deno兼容导入源

推荐使用https://esm.sh/web-push作为导入链接,它对Deno的适配性更好。

3. 修正后的完整代码示例

import * as webPush from "https://esm.sh/web-push";

Deno.serve(async (req) => {
  const vapidKeys = {
    publicKey: '<你的VAPID公钥>',
    privateKey: '<你的VAPID私钥>',
  };

  // 仅保留VAPID配置,这是现代推送的标准方案
  webPush.setVapidDetails(
    'mailto:example@yourdomain.org',
    vapidKeys.publicKey,
    vapidKeys.privateKey
  );

  // 从请求体或数据库获取用户的推送订阅信息
  const { subscription } = await req.json();

  try {
    // 发送推送通知
    await webPush.sendNotification(subscription, '你的推送内容');
    return new Response(JSON.stringify({ success: true }), {
      headers: { 'Content-Type': 'application/json' },
      status: 200
    });
  } catch (error) {
    console.error('推送失败:', error);
    return new Response(JSON.stringify({ success: false, error: error.message }), {
      headers: { 'Content-Type': 'application/json' },
      status: 500
    });
  }
});

额外注意事项

  • VAPID密钥生成:如果还没有VAPID密钥,可以在本地Node环境中运行web-push generate-vapid-keys命令生成,然后把公钥和私钥复制到边缘函数里。
  • 边缘函数限制:Supabase边缘函数最长执行时间为10秒,推送操作要确保在这个时间内完成,避免复杂的前置逻辑。
  • CORS配置:如果从前端调用这个边缘函数,需要在Supabase控制台的边缘函数设置里,添加允许的请求来源。

备注:内容来源于stack exchange,提问作者tobias hassebrock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 13:07:58