node.js与mongodb交互时出现TypeError: Cannot read property 'db' of null

我使用了一个huya-danmu的第三方包来实现对虎牙直播平台直播间弹幕礼物的监听
地址:https://github.com/BacooTang/...
并将弹幕礼物信息存入mongodb中,逻辑是先通过查询mysql获得所有以存的虎牙直播间地址,在回调函数中对查询结果进行遍历,逐一执行弹幕礼物监听代码,并将结果存储到mongo中
但是在程序运行中总会出现TypeError: Cannot read property 'db' of null的错误,这个错误有时会直接中断程序抛出异常,有时不会终端程序而显示在我规定输入的日志当中。

中断程序的报错信息:

clipboard.png

日志当中的错误信息:
[2018-06-13T16:31:34.777] [DEBUG] default - MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect EADDRINUSE 127.0.0.1:27017]

以下是与mongo交互部分的代码:

client.on('message', msg => {
            switch (msg.type) {
                case 'chat':
                    // 存入mongodb数据库
                    mongoclient.connect(danmu_con.mongo_url, function (err, db) {
                        if(err) {
                            logger.debug(`${err}`);
                        };
                        var dbo = db.db('danmu');
                        var data = {anchor_id: `${id}`, live_url: `${element}`, platform_id: 7, add_time: parseInt(`${time}`), type: 'danmu', content: `${msg.content}`};
                        dbo.collection('huya').insertOne(data, function (err, result) {
                            if (err) {
                                logger.debug(`${err}`);
                            };
                            // console.log('弹幕数据插入成功');
                            db.close();
                        });
                    });
                    // console.log(`[${msg.from.name}]:${msg.content}`);
                    break;
                case 'gift':
                    // 存入mongodb数据库
                    mongoclient.connect(danmu_con.mongo_url, function (err, db) {
                        if(err) {
                            logger.debug(`${err}`);
                        };
                        var dbo = db.db('danmu');
                        var data = {anchor_id: `${id}`, live_url: `${element}`, platform_id: 7, add_time: parseInt(`${time}`), type: 'gift', content: `${msg.name}`, gift_num: `${msg.count}`};
                        dbo.collection('huya').insertOne(data, function (err, result) {
                            if(err) {
                                logger.debug(`${err}`);
                            };
                            // console.log('礼物数据插入成功');
                            db.close();
                        });
                    });
                    // console.log(`[${msg.from.name}]->赠送${msg.count}个${msg.name}`);

                    // 将礼物信息存入xj_gift_value表中
                    dbhelper.Query(format(select_sql, msg.name, huya_id), function (err, rows) {
                        if (err) {
                            logger.debug(err);
                        };
                        if (rows.length == 0) {
                            dbhelper.Query(format(insert_sql, msg.id, msg.name, huya_id, parseFloat(msg.earn/msg.count), time, time), function (err, rows) {
                                if (err) {
                                    logger.debug(err);
                                }else{
                                    logger.debug('insert successfully!');
                                };
                            });
                        };
                    });
                    break;
                case 'online':
                    // console.log(`[当前人气]:${msg.count}`);
                    break;
            };
        });

希望各位大佬能够解答我的疑惑,十分感谢!

阅读 7k
1 个回答

错误信息中显示 127.0.0.1:27017已经被占用了,之所以会出现这种现象,我猜是不是因为重复conncet mongodb导致的,建议:一种是把所有逻辑都放到connect大回调里,另外一种是使用连接池

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题