2017-04-19 5 views
0

Ich habe etwa 300.000 Dokumente in einer meiner Sammlungen in Mongodb und das ist alles in AWS sitzen. Wenn ich nach dieser bestimmten Route (ding2) frage, scheint es, als wäre es zu viel für Mongo, damit der mongod-Dienst abstürzt. Ich habe meinem Code ein Limit hinzugefügt, aber es funktioniert immer noch nicht. Im Idealfall würde ich gerne nach bestimmten Keywords suchen können, aber dieser Teil wurde vorerst auskommentiert.Nodejs Code Absturz Mongodb Server

var express = require('express') 
var app = express() 

app.get('/', function (req, res) { 
    res.send('Hello World!') 
}); 

app.get('/thing2', function(req, res) { 

    var username = req.query.username 
    var keyword = req.query.keyword 

    var MongoClient = require('mongodb').MongoClient, 
     assert = require('assert'); 
    var url = 'mongodb://localhost:27017/my_db'; 

    MongoClient.connect(url, function(err, db) { 
     if (err) throw err; 

     var collection = db.collection('my_collection'); 
     /* collection.find({ $and: [ 
      * {"text" : {$regex : ".*"+keyword+".*"}}, 
      * {"username" : username} 
      * ] }).limit(5).toArray(function(err, docs) { 
      */ 

     collection.find({"user.screen_name" : username}).limit(1).toArray(function(err, docs) { 
      console.log("\n" + new Date().toLocaleString() + " " + username); 

      if (!err) { 
       console.log(docs.length) 
      } else { 
       console.log(err) 
      } 

      res.send(docs) 
     }); 
    }); 
}); 

app.listen(80, function() { 
    console.log('Listening on port 80!') 
}); 

Der Fehler, den ich in meiner Konsole sehen ist:

{ [MongoError: connection 0 to localhost:27017 closed] 
    name: 'MongoError', 
    message: 'connection 0 to localhost:27017 closed' } 

Edit: Mongo log

2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] 
2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 
2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] 
2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 
2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2017-04-19T03:59:03.458+0000 I CONTROL [initandlisten] 
2017-04-19T03:59:03.471+0000 I FTDC  [initandlisten] Initializing full-time diagnostic data capture with directory '/var/lib/mongodb/diagnostic.data' 
2017-04-19T03:59:03.471+0000 I NETWORK [initandlisten] waiting for connections on port 27017 
2017-04-19T03:59:03.471+0000 I NETWORK [HostnameCanonicalizationWorker] Starting hostname canonicalization worker 
2017-04-19T03:59:04.003+0000 I FTDC  [ftdc] Unclean full-time diagnostic data capture shutdown detected, found interim file, some metrics may have been lost. OK 
2017-04-19T03:59:23.504+0000 I COMMAND [ftdc] serverStatus was very slow: { after basic: 40, after asserts: 110, after connections: 130, after extra_info: 160, after globalLock: 310, after locks: 540, after network: 630, after opcounters: 760, after opcountersRepl: 870, after storageEngine: 1120, after tcmalloc: 1540, after wiredTiger: 2690, at end: 3370 } 
+3

Sie brauchen nicht (sollte nicht), um die ganze Zeit, die Sie eine Anfrage haben, zu verbinden. Sie können sich einmal am Anfang verbinden und diese Verbindung in Ihrer gesamten Anwendung verwenden. –

+0

@ israel.zinc wie würde ich das dann reparieren? – user1883614

+0

Was sagt das Mongo-Log, wenn der Service abstürzt? Sind Sie in einer Nano-Instanz? Mongo ist ziemlich solide normalerweise – Matt

Antwort

0

Das Problem ist, dass Sie zu oft eine Verbindung herstellen. Ich würde den Code mit Mungo Redo:

var express = require('express') 
var app = express() 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/my_db') 
var collection = require('user'); 

app.get('/', function (req, res) { 
    res.send('Hello World!') 
}); 

app.get('/thing2', function(req, res) { 

    var username = req.query.username 
    var keyword = req.query.keyword 

    collection.find({"user.screen_name" : username}).limit(1).toArray(function(err, docs) { 
      console.log("\n" + new Date().toLocaleString() + " " + username); 

      if (!err) { 
       console.log(docs.length) 
      } else { 
       console.log(err) 
      } 
      res.send(docs) 
    }); 
}); 

app.listen(80, function() { 
    console.log('Listening on port 80!') 
}); 

Sie können wie folgt ein Mungo-Schema-Modell (der Name der Datei ist: "user.js"):

var mongoose  = require('mongoose'); 
var Schema  = mongoose.Schema; 

var UserSchema = new Schema({ 
    name: String, 
    userId : Number 
}); 
module.exports = mongoose.model('User', UserSchema); 

Versuchen Sie, damit es funktioniert minimal und dann mit dir echtes Modell zu erhöhen. Hope meine Antwort war hilfreich