简体   繁体   中英

Mongoose query blocks Node.js

Mongoose blocks Node.js when it is getting data. I thought that it is supposed to be absolutely no blocking and when callback appears then it should just get back there.

The problem is with:

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

When I will run this route in ExpressJS it will just freeze NodeJS for around 10sec, and no one else can reach connection then.

I'm having a open connection to MongoDB at the start using Mongoose and not doing anything with it later on. What's the problem? It is supposed to work like that?

UPDATE:

So this is how I init mongoose

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

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

and this is the place where i connect and init models

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);
        });
    }
};

and the model

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



var container = new Schema({

});


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


module.exports = model;

It returns around 26k documents.

Ok so basically I found out, that if I will stream that instead of getting it with one callback it will work way better (I will be able to get into some other actions)

like this

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

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

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

It will solve the problem. So this is how I would get big data from mongodb, though why it is slowing so much if I will get it in one callback? Due to 12MB data? Big json that needs to be parsed or what? Cause this is a quite mysterious for me (the reason for slow down)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM