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>)
解决方法
升级PubNub SDK版本
你当前使用的3.16.5是2017年的老旧版本,完全不兼容现代Next.js的服务端运行环境,这是触发错误的核心原因。直接升级到最新的PubNub JavaScript SDK(v7.x版本),新版本对Node.js环境做了完整适配。调整服务端初始化代码
升级后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 }); } }
清理冗余逻辑
原代码同时混用await和回调函数,会导致逻辑混乱,升级后直接使用Promise语法即可,无需保留回调。检查Node.js版本
确保你的Next.js项目使用的Node.js版本符合PubNub新版本要求(建议v16及以上)。
内容的提问来源于stack exchange,提问作者DAMAR225
相关产品推荐
相关产品推荐

