鍍金池/ 問(wèn)答/Python  數(shù)據(jù)庫(kù)  HTML/ node.js與mongodb交互時(shí)出現(xiàn)TypeError: Cannot re

node.js與mongodb交互時(shí)出現(xiàn)TypeError: Cannot read property 'db' of null

我使用了一個(gè)huya-danmu的第三方包來(lái)實(shí)現(xiàn)對(duì)虎牙直播平臺(tái)直播間彈幕禮物的監(jiān)聽(tīng)
地址:https://github.com/BacooTang/...
并將彈幕禮物信息存入mongodb中,邏輯是先通過(guò)查詢mysql獲得所有以存的虎牙直播間地址,在回調(diào)函數(shù)中對(duì)查詢結(jié)果進(jìn)行遍歷,逐一執(zhí)行彈幕禮物監(jiān)聽(tīng)代碼,并將結(jié)果存儲(chǔ)到mongo中
但是在程序運(yùn)行中總會(huì)出現(xiàn)TypeError: Cannot read property 'db' of null的錯(cuò)誤,這個(gè)錯(cuò)誤有時(shí)會(huì)直接中斷程序拋出異常,有時(shí)不會(huì)終端程序而顯示在我規(guī)定輸入的日志當(dāng)中。

中斷程序的報(bào)錯(cuò)信息:

clipboard.png

日志當(dāng)中的錯(cuò)誤信息:
[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數(shù)據(jù)庫(kù)
                    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('彈幕數(shù)據(jù)插入成功');
                            db.close();
                        });
                    });
                    // console.log(`[${msg.from.name}]:${msg.content}`);
                    break;
                case 'gift':
                    // 存入mongodb數(shù)據(jù)庫(kù)
                    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('禮物數(shù)據(jù)插入成功');
                            db.close();
                        });
                    });
                    // console.log(`[${msg.from.name}]->贈(zèng)送${msg.count}個(gè)${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(`[當(dāng)前人氣]:${msg.count}`);
                    break;
            };
        });

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

回答
編輯回答
忘了我

錯(cuò)誤信息中顯示 127.0.0.1:27017已經(jīng)被占用了,之所以會(huì)出現(xiàn)這種現(xiàn)象,我猜是不是因?yàn)橹貜?fù)conncet mongodb導(dǎo)致的,建議:一種是把所有邏輯都放到connect大回調(diào)里,另外一種是使用連接池

2018年7月10日 03:05