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

Next.js服务端PubNub类无法正常使用问题求助

Next.js服务端使用PubNub Access Manager触发500错误

问题详情

在Next.js中集成PubNub Access Manager时,客户端调用PubNub类一切正常,但在服务端API路由(api/pubnub/)中运行时出现500内部服务器错误。

服务端API代码

export default async function handler(req, res) {
try {
    const authKey = generateAuthKey();
    const pubnub = new PubNub({
        publish_key: "pub-c-..",
        subscribe_key: "sub-c-..",
        secret_key: "sec-c-..",
        userId: "myUniqueUserId",
    });

    const token = await pubnub.grant(
        {
            channels: ["chats.room1", "chats.room2"],
            authKeys: [authKey],
            ttl: 1440,
            read: true,
            write: true,
        },
        function (status: any) {
            // console.log(status);
        }
    );
    res.status(200).json(authKey);
} catch (error) {
    console.log(error);
    return res.status(500).json(error);
}
}

环境信息

  • PubNub版本:^3.16.5

错误日志

前端Axios返回错误

{
"message": "Request failed with status code 500",
"name": "AxiosError",
"config": {
    "transitional": {
        "silentJSONParsing": true,
        "forcedJSONParsing": true,
        "clarifyTimeoutError": false
    },
    "transformRequest": [
        null
    ],
    "transformResponse": [
        null
    ],
    "timeout": 0,
    "xsrfCookieName": "XSRF-TOKEN",
    "xsrfHeaderName": "X-XSRF-TOKEN",
    "maxContentLength": -1,
    "maxBodyLength": -1,
    "env": {
        "FormData": null
    },
    "headers": {
        "Accept": "application/json, text/plain, */*",
        "Content-Type": "application/json"
    },
    "method": "post",
    "url": "/api/pubnub/",
    "data": "{}"
},
"code": "ERR_BAD_RESPONSE",
"status": 500
}

服务端控制台错误

error - TypeError: Cannot use 'in' operator to search for 'EventEmitter' in undefined
at keepAliveIsEmbedded (/node_modules/pubnub/node.js/lib/xdr.js:12:25)
at Object.createInstance (/node_modules/pubnub/node.js/lib/xdr.js:183:9)
at new CREATE_PUBNUB (/node_modules/pubnub/node.js/pubnub.js:69:25)
at runMicrotasks (<anonymous>)

解决方法

  1. 升级PubNub SDK版本
    你当前使用的3.16.5是2017年的老旧版本,完全不兼容现代Next.js的服务端运行环境,这是触发错误的核心原因。直接升级到最新的PubNub JavaScript SDK(v7.x版本),新版本对Node.js环境做了完整适配。

  2. 调整服务端初始化代码
    升级后PubNub的API有语法变更,服务端代码需要对应调整,示例如下:

import { PubNub } from 'pubnub';

export default async function handler(req, res) {
  try {
    const authKey = generateAuthKey(); // 确保此函数已正确实现
    const pubnub = new PubNub({
      publishKey: "pub-c-..",
      subscribeKey: "sub-c-..",
      secretKey: "sec-c-..",
      userId: "myUniqueUserId",
    });

    // 仅使用async/await,无需混合回调函数
    await pubnub.grant({
      channels: ["chats.room1", "chats.room2"],
      authKeys: [authKey],
      ttl: 1440,
      read: true,
      write: true,
    });

    res.status(200).json(authKey);
  } catch (error) {
    console.error('PubNub授权失败:', error);
    res.status(500).json({ message: '服务端处理出错', error: error.message });
  }
}
  1. 清理冗余逻辑
    原代码同时混用await和回调函数,会导致逻辑混乱,升级后直接使用Promise语法即可,无需保留回调。

  2. 检查Node.js版本
    确保你的Next.js项目使用的Node.js版本符合PubNub新版本要求(建议v16及以上)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:22:34