2017-01-31 9 views
0

私のプロジェクトでは2つのハードウェアデバイスがあります。 2分ごとにJSONオブジェクトでAPIに当たっています。別の時間にヒットした場合、私のコントローラーはJSONオブジェクトmongodbの両方を格納します。nodejsで2つのデバイスが同時にapiをヒットした場合、JSONオブジェクトをmongodbに保存する方法

しかし、両方のデバイスが同時にAPIをヒットした場合、2番目のエラーが発生するために、1番目のオブジェクトがデータベースに保存されます。

同時に2つのデバイスが「pushSensorData」を押すと、その時にmongoエラーが発生します。

pushSensorData: function(req, res) { 
 

 
     receievedMessage = req.query; 
 
     console.log('received message ', receievedMessage); 
 
     MongoClient.connect(mongoUrl, function(err, db) { 
 

 
      db.collection('sensor').find({ "sMacId": receievedMessage.MAC }).toArray(function(error, response) { 
 
      ievedMessage.timestamp = new Date(receievedMessage.timestamp); 
 
       receievedMessage["sensorMacId"] = receievedMessage.MAC.toString(); 
 
       if (receievedMessage.sensorMacId != null) { 
 

 
        receievedMessage["occupancy"] = parseInt(receievedMessage.OC); 
 
        receievedMessage["ambientLight"] = parseInt(receievedMessage.ALS); 
 
        receievedMessage["power"] = parseInt(receievedMessage.POW); 
 
        receievedMessage["timestamp"] = receievedMessage.timestamp; 
 

 

 

 
        if (isNaN(receievedMessage.occupancy)) 
 
         receievedMessage["occupancy"] = 0; 
 

 
        if (isNaN(receievedMessage.ambientLight)) 
 
         receievedMessage["ambientLight"] = 0; 
 

 

 
        if (isNaN(receievedMessage.power)) 
 
         receievedMessage["power"] = 0; 
 

 

 
        delete receievedMessage.MAC; 
 
        delete receievedMessage.OC; 
 
        delete receievedMessage.ALS; 
 
        delete receievedMessage.POW; 
 
        insertDocument(db, function() { 
 
         db.close(); 
 
        }); 
 

 
       } else { 
 
        db.close(); 
 
       } 
 
      }) 
 

 

 
     }); 
 

 
     var insertDocument = function(db, callback) { 
 
      db.collection('sensordata').insertMany([receievedMessage], function(err, response) { 
 
       console.log("Inserted", response); 
 
      }); 
 
     }; 
 

 
    }, 
 

 
};

これはエラーが TypeError例外を取得しています:未定義 0のプロパティを読み取ることができません 'のtoString' |アプリ| at /home/sp_mean/smartpower/api/controllers/SensorMessageController.js:63:71 0 | app | at handleCallback(/home/sp_mean/smartpower/node_modules/mongodb/lib/utils.js:95:56) 0 | app | /home/sp_mean/smartpower/node_modules/mongodb/lib/cursor.js:852:16 0 | app |ハンドルコールバック(/home/sp_mean/smartpower/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:171:5) 0 | app |でsetCursorNotified(/home/sp_mean/smartpower/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:516:3) 0 |アプリケーション| /home/sp_mean/smartpower/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:591:16 0 | app | at queryCallback(/home/sp_mean/smartpower/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:232:18) 0 |アプリケーション| /home/sp_mean/smartpower/node_modules/mongodb/node_modules/mongodb-core/lib/connection/pool.js:455:18 0 | app | _combinedTickCallback(内部/プロセス/ next_tick.js:67:7) 0 | app | process._tickDomainCallback(内部/プロセス/ next_tick.js:122:9)で PM2 | id [0]とpid [38409]、シグナル[SIGINT]経由でコード[1]で終了したApp [app] PM2 | -forkモードでの実行開始 - アプリケーション名:app id:0

+0

確かに分かりにくいですが、セッションを使用する必要がありますか? –

+0

2番目のリクエストがdbにヒットしようとしている間に、最初のリクエストでmongo接続を閉じることができます。サーバーの起動時に一度だけ接続し、開いたままにしてください。 –

+0

これは*何*エラー? – str

答えて

0

あなたがコードをよく見れば、操作後にデータベース接続を終了していることがわかりますdb.close(); だから、 2番目のリクエストの実行時にエラーが発生した場合、データベースを閉じるために省略するか(実際には大したことではありません)、既存のプロセスがどちらかを処理したり、セッションを使用してリクエストを分離したりします。

+0

セッションの使い方を教えてください。 – Chandrashekhar

+0

セッションの方法を教えてもらえますか? – Chandrashekhar

関連する問題