WhatsApp Web JS已关联会话初始化却出现二维码问题求助


问题描述
各位技术同仁好:我尝试调用数据库中已在WhatsApp上处于活跃状态的所有会话,但启动这些已完成认证的会话时,却出现了二维码,这不符合预期,请问该如何解决?
(注:远程会话已存储在数据库中,我可以看到相关文件)
WhatsApp客户端类代码
class WhatsappClient { constructor(id, store) { this.client = new Client({ restartOnAuthFail: true, puppeteer: { headless: true, args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--no-first-run', '--no-zygote', '--disable-gpu', ], }, authStrategy: new RemoteAuth({ clientId: id, store: store, backupSyncIntervalMs: 400000, }), }); }
会话启动逻辑代码
const getAllSessions = await sessionsModel .find({ status: 'connected', remoteSessionSaved: true, groupid: { $ne: null }, }) .lean(); logger.info( `${JSON.stringify(getAllSessions)} all sessions to listen to ` ); let store; if (mongoStoreForWhatsappSessions[0]) { store = mongoStoreForWhatsappSessions[0]; } else { store = new MongoStore({ mongoose }); } getAllSessions.map(async (session) => { const { client } = new WhatsappClient(session?.id, store); client.on(QR, async (qr) => { logger.info('qr recieved the session is logged out ', session?.id); const sessionsUpdate = await sessionsModel.findOneAndUpdate( { id: session?.id, }, { loggedOutStatus: 'logout', } ); client.destroy(); }); client.on(READY, async () => { logger.info( 'Whatsapp is ready! for session and to store all the data', session?.id ); const messagesSent = await getAllMessagesInfoAndStoreInDB( client, session?.groupid, session?.communityObjectId ); }); await client.initialize(); });
解决思路与方案
1. 严格匹配RemoteAuth的clientId
确认session?.id和数据库中存储会话时使用的clientId完全一致,注意大小写、特殊字符,避免MongoDB返回的ID存在格式转换问题(比如ObjectId转字符串后的差异)。
2. 统一复用MongoStore实例
当前代码中Store实例的复用逻辑可能存在隔离问题,建议全局使用单例Store,确保所有客户端读取同一份会话数据:
// 改为全局单例模式,避免重复创建Store const store = mongoStoreForWhatsappSessions[0] || new MongoStore({ mongoose });
3. 关闭认证失败自动重启
restartOnAuthFail: true会在认证失败时反复重启客户端,可能导致持续触发QR事件,先关闭该选项排查真实问题:
this.client = new Client({ restartOnAuthFail: false, // 修改为false // 其余配置保持不变 });
4. 检查会话数据完整性
确认MongoDB中对应会话集合(默认wwebjs-sessions)里,匹配clientId的记录包含完整的auth字段(需包含WABrowserId、WASecretBundle、WAToken1、WAToken2),若数据损坏或过期,需重新认证后再存储。
5. 修正异步循环的资源竞争问题
map(async ...)会导致多客户端同时初始化,引发存储读取冲突,改用for...of循环确保顺序初始化:
// 替换原map循环 for (const session of getAllSessions) { const { client } = new WhatsappClient(session.id, store); // 绑定事件和初始化逻辑不变 await client.initialize(); }
6. 添加认证失败事件监听
通过AUTH_FAILURE事件获取详细错误信息,精准定位问题:
client.on('AUTH_FAILURE', (msg) => { logger.error(`会话认证失败: ${session.id}, 原因: ${msg}`); });
内容的提问来源于stack exchange,提问作者Mohammed Khan
相关产品推荐
相关产品推荐

