2017-07-13 1 views
3

J'ai désespérément besoin d'aide.J'essaie de télécharger de gros fichiers (8 Go) à gridfs en utilisant mongoose et nodeJS. Mais comme le fichier est très volumineux, il faut du temps pour le télécharger. Et après un certain temps, je reçois l'erreur suivante:mongodb erreur de connexion timeout avec mongoose et nodejs

home/user/FileUpload/node_modules/mongodb/lib/utils.js:98 
    process.nextTick(function() { throw err; }); 
           ^
MongoError: connection 0 to 127.0.0.1:27017 timed out 
    at Function.MongoError.create (/home/user/FileUpload/node_modules/mongodb-core/lib/error.js:29:11) 
    at Socket.<anonymous> (/home/user/FileUpload/node_modules/mongodb-core/lib/connection/connection.js:186:20) 
    at Object.onceWrapper (events.js:314:30) 
    at emitNone (events.js:105:13) 
    at Socket.emit (events.js:207:7) 
    at Socket._onTimeout (net.js:402:8) 
    at ontimeout (timers.js:488:11) 
    at tryOnTimeout (timers.js:323:5) 
    at Timer.listOnTimeout (timers.js:283:5) 

J'ai essayé de résoudre ce problème en augmentant connectTimeoutMS mais l'erreur persiste encore. J'utilise MongoDB 3.4.5 mongoose 4.8.4 nodejs 8.1.4 et npm 5.0.3.

Après est app.js:

var mongoose = require('mongoose'); 
var schema = mongoose.schema; 
mongoose.connect('mongodb://127.0.0.1/gridFS'),{ 
    server: { 
     socketOptions: { 
      socketTimeoutMS: 3000000, 
      connectionTimeoutMS: 3000000, 
      keepAlive:3000000 
     } 
    }, 

    replset: { 
     socketOptions: { 
      keepAlive: 3000000, 
      connectTimeoutMS: 3000000 
     } 
    } 
}; 
var conn = mongoose.connection; 
var path = require('path'); 
var Grid = require('gridfs-stream'); 
var fs = require('fs'); 
var videoPath = path.join(__dirname, 'readFrom/bio seq test1.txt'); 
Grid.mongo = mongoose.mongo; 
conn.once('open', function(){ 

    console.log('- connection open -'); 
    var gfs = Grid(conn.db); 

    var writestream = gfs.createWriteStream({ 

     filename: 'bio seq test 1' 
    }); 

    fs.createReadStream(videoPath).pipe(writestream); 
    writestream.on('close', function(file){ 
     console.log(file.filename + 'Written to DB'); 
    }); 
}); 

Ce qui suit est le fichier package.json:

{ 
    "name": "file-upload-gridfs", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo '' &amp;&amp; exit 1" 
    }, 
    "keywords": [], 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "body-parser": "^1.16.1", 
    "cookie-parser": "^1.4.3", 
    "express": "^4.14.1", 
    "gridfs-stream": "^1.1.1", 
    "mongoose": "^4.8.4", 
    "morgan": "^1.8.2", 
    "multer": "1.3.0", 
    "multer-gridfs-storage": "1.0.0", 
    "path.join": "^1.0.0", 
    "serve-favicon": "^2.4.3" 
    } 
} 

Répondre

4

Ok. J'ai trouvé le problème en utilisant cette discussion très utile. Le temps de connexion par défaut pour MongoDB est de 30 secondes. Si une requête/opération prend plus de temps, la connexion est annulée et une erreur de délai de connexion se produit. Avec cette modification, j'ai pu télécharger un fichier de 32 Go sur GridFS sans interruption.

https://github.com/Automattic/mongoose/issues/4789

je passais le paramètre de délai d'attente de manière suivante.

server: { 
     socketOptions: { 
      socketTimeoutMS: 3000000, 
      connectionTimeoutMS: 3000000, 
      keepAlive:3000000 
     } 
    }, 

    replset: { 
     socketOptions: { 
      keepAlive: 3000000, 
      connectTimeoutMS: 3000000 
     } 
    } 
}; 

Mais il doit être réglé de la manière suivante:

const serverOptions = { 
    poolSize: 100, 
    socketOptions: { 
    socketTimeoutMS: 6000000 
    } 
}; 

mongoose.createConnection(dbpath, { 
    server: serverOptions, 
    replset: serverOptions //if you are using replication 
}); 

Dans mon cas, je l'ai utilisé localhost.

const serverOptions = { 
    poolsize:100 , 
    socketOptions:{ 
     socketTimeoutMS: 6000000 
     } 
    }; 
    var mongodbUri = 'mongodb://localhost:27017/gridFS'; 
    mongoose.connect(mongodbUri, { 
    server: serverOptions 
    }); 

Espérons que cela aidera toute personne ayant un problème similaire.

+0

Cela a résolu mon problème en augmentant SocketTimeoutMS –

+0

J'utilise Mongodb 3.2 et Native Driver Mongodb 2.2.4. J'exécute la requête agrégée avec $ out à la fin. J'ai ajouté la configuration ci-dessus pendant la connexion de DB. Mais encore j'obtiens l'erreur en tant que "MongoError: la connexion 489 à expiré" –