2016-10-22 5 views
0

У меня есть проблема с вставкой данных в Монго БД с помощью узла (экспресс)Как вставить данные в Монго синхронно (Nodejs, Express)

Мой код выглядит следующим образом:

router.get('/data/:section/:sort', function(req, res, next) { 
//Deleting old data always before writing new 
//Image.remove().exec(); 
var section = req.params.section; 
var sort = req.params.sort; 
//Link to Igmur API 
var url = 'https://api.imgur.com/3/gallery/'+section+'/'+sort+'/1'; //1 at the end is used to get more than 60 images(gives only 60 without it) 
    request.get({ 
    url: url, 
    method: 'GET', 
    headers: { 
     'Authorization': 'Client-Id XXXXXXXXXXXXX' 
    }}, function(e, r, body){ 
var metadata = JSON.parse(body); 
for(var i = 0; i<100; i++){ 
     var image = new Image(metadata.data[i]) 
     image.save(function(err, result){ 
     }); 
};res.render('index', { title: 'SearchAPI' });});}); 

Проблема заключается в том что я получаю только около 20 объектов, вставленных вместо 100, как вы можете видеть в цикле. Все потому, что узел просто прыгнет вперед, прежде чем метод сохранения будет полностью выполнен. Как я могу это исправить? Спасибо заранее

+0

btw все в порядке с автономным приложением. Но в выражении это идет не так – JavaEvgen

ответ

2

Используйте обещание библиотеки, такие как Q

То, что вы в принципе нужно сделать, это ждать, пока все ваши save методы, чтобы закончить. Используйте метод Q.all, который ждет все, что нужно выполнить.

var Q = require('q'); 

var promiseArr = []; 

for(var i = 0; i<100; i++){ 
     var imgDefer = Q.defer(); 
     var image = new Image(metadata.data[i]) 
     image.save(function(err, result){ 
      if(err)imgDefer.reject(err); 
      else imgDefer.resolve() 
     }); 
     promiseArr.push(imgDefer); 
} 
Q.all(promiseArr).then (function(){ 
    res.render('index', { title: 'SearchAPI' }); 
}) 
+0

Я попробую поблагодарить вас. – JavaEvgen

+0

Я не знаю почему, но он по-прежнему дает мне только 20 строк: S Но я знаю, что входные данные имеют 650 строк, и мне нужно только 100 из них – JavaEvgen

+0

Newermind Я просто идиот xD Проверял все вставки с помощью mongo cmd , поэтому он дал мне только первые 20, а затем «наберите его для большего». Я не заметил: D Thanx ваш код работает! Но я думаю, что моя работала также xD – JavaEvgen