Node.js开发WhatsApp机器人遇报错:client未初始化就绑定事件
WhatsApp Web JS机器人异步初始化问题解决
我正在使用whatsapp-web-js包开发WhatsApp聊天机器人,但作为Node.js及异步代码新手,遇到了实现问题。
原代码
let client; //Connect to the database to get old persisted session data mongoose.connect('mongodb+srv://...url').then(() => { //once connected, create new session "client" with persisted data const store = new MongoStore({ mongoose: mongoose }); client = new Client({ authStrategy: new RemoteAuth({ store: store, backupSyncIntervalMs: 60000 }) }); ready = false; client.initialize().then(r => console.log("Initializing whatsapp client")); //Generate QR Code if needed const qrcode = require('qrcode-terminal'); client.on('qr', qr => { qrcode.generate(qr, {small: true}); }); }); //Client has saved remote session client.on('remote_session_saved', () => { console.log('Client remote session saved'); }); //Client is ready to send/receive requests client.on('ready', () => { console.log('Client is ready to send/receive requests'); });
问题原因
触发空指针错误的核心是Node.js的异步执行特性:mongoose.connect()是异步操作,会在后台执行数据库连接,而主线程会继续执行后续绑定事件的代码——此时client还未被初始化,处于undefined状态,自然会报错。
解决方法
把所有需要操作client的代码(包括事件监听)都放到mongoose.connect()的then回调内部,确保只有在数据库连接完成、client实例创建后,再去绑定事件:
const qrcode = require('qrcode-terminal'); let client; //Connect to the database to get old persisted session data mongoose.connect('mongodb+srv://...url').then(() => { //once connected, create new session "client" with persisted data const store = new MongoStore({ mongoose: mongoose }); client = new Client({ authStrategy: new RemoteAuth({ store: store, backupSyncIntervalMs: 60000 }) }); ready = false; client.initialize().then(r => console.log("Initializing whatsapp client")); //Generate QR Code if needed client.on('qr', qr => { qrcode.generate(qr, {small: true}); }); //Client has saved remote session client.on('remote_session_saved', () => { console.log('Client remote session saved'); }); //Client is ready to send/receive requests client.on('ready', () => { console.log('Client is ready to send/receive requests'); }); });
注:将require('qrcode-terminal')移到文件顶部,避免在回调内重复加载模块,优化代码结构。
内容的提问来源于stack exchange,提问作者Oirampok
相关产品推荐
相关产品推荐

