2016-04-12 9 views
0

Mongoose Blöcke Node.js, wenn es Daten erhält. Ich dachte, dass es absolut keine Blockierung sein sollte und wenn ein Callback erscheint, dann sollte es einfach zurückkommen.Mongoose Query Blöcke Node.js

Das Problem ist, mit:

Container.find({}, function (err, documents) { 
     res.status(200).send(documents); 
}); 

Wenn ich diesen Weg in Express.js laufen wird es nur NodeJS für 10sec um einfrieren, und niemand kann sonst Verbindung dann erreichen.

Ich habe zu Beginn eine offene Verbindung zu MongoDB, benutze Mungo und mache später nichts damit. Was ist das Problem? Es soll so funktionieren?

UPDATE:

Also das ist, wie ich

function initialDb() { 
seed(); 
seedStructure(); 
startApplication(); 
} 

database.connect(); 
database.loadModels(initialDb); 

Mungo init und dies ist der Ort, an dem ich verbinden und init Modelle

import mongoose from 'mongoose'; 
import chalk from 'chalk'; 
import config from '../config'; 

export default { 
    loadModels(callback){ 
     require('../../models/site'); 
     require('../../models/page'); 
     require('../../models/container'); 
     require('../../models/template'); 
     require('../../models/theme'); 

     if (typeof callback === 'function') { 
      return callback(); 
     } 
    }, 

    connect() { 
     mongoose.connect(config.db.uri, function (err) { 
      if (err) { 
       console.error(chalk.red('Could not connect to MongoDB!')); 
       console.log(err); 
      } 
     }); 
    }, 

    disconnect(callback) { 
     mongoose.disconnect(function (err) { 
      console.info(chalk.yellow('Disconnected from MongoDB.')); 
      callback(err); 
     }); 
    } 
}; 

und das Modell

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



var container = new Schema({ 

}); 


let model = mongoose.model('container', container); 


module.exports = model; 

Es gibt rund 26k Dokumente zurück.

+0

Sie haben absolut Recht, dass diese Abfragen _not_ nicht fallen sollten. Kannst du ein wenig mehr Kontext darüber teilen, wie du dich mit Mungo und dem Modellcode verbindest? –

+0

@JohnnyHK gibt es rund 26k Datensätze zurück. – Shiroo

+0

@NickTomlin ich aktualisierte Informationen – Shiroo

Antwort

0

Ok so im Grunde habe ich herausgefunden, dass, wenn ich es, dass, anstatt sich mit einem Rückruf streamen wird es viel besser funktionieren (ich in der Lage, in einige andere Aktionen zu bekommen)

wie diese

var stream = Container.find({}).stream(); 

var array = []; 
stream.on('data', (doc) => { 
    array.push(doc); 
}).on('error', (err) => { 

}).on('close',() => { 
    res.send(array); 
}); 

Es wird das Problem lösen. So würde ich also große Daten von mongodb bekommen, aber warum wird es so langsam, wenn ich es in einem Callback bekomme? Aufgrund von 12 MB Daten? Big JSON, das geparst werden muss oder was? Denn das ist ein ziemlich mysteriös für mich (der Grund für die Verlangsamung)