2016-02-18 3 views
1

Я пишу фильтр, используя собственный драйвер mongodb, но это заставляет меня эту ошибку при запуске запроса.ошибка драйвера родного драйвера mongodb по запросу

В случае с этим драйвером у него нет exec?

Каков другой способ выполнения этого запроса?

exports.findAll = function(req, res) { 

    MongoClient.connect(url, function(err, db) { 

     var section  = req.params.section; 
     var collection = db.collection(section); 

     var filter = req.query.filter ? {nameToLower: new RegExp('^' + req.query.filter.toLowerCase())} : {}; 
     var query = collection.find(filter); 
     var count = 0; 

     collection.count(filter, function (error, result) { 
      count = result; 
     }); 

     if(req.query.order) { 
      query.sort(req.query.order); 
     } 

     if(req.query.limit) { 
      query.limit(req.query.limit); 

      if(req.query.page) { 
       query.skip(req.query.limit * --req.query.page); 
      } 
     } 

     query.exec(function (error, results) { 
      res.json({ 
       count: count, 
       data: results 
      }); 
     }); 

    }); 

}; 

Ошибка:

TypeError: undefined is not a function 
+0

Не могли бы вы уточнить ошибку. ** На какой линии сделал это указывает на ошибку ** –

+0

query.exec (функция (ошибка, результаты) { res.json ({ Количество: кол, данных: результаты }); }); –

ответ

1

Лучше использовать async библиотеку в этом случае, как это упрощает код. В случае, когда вам нужно выполнить несколько задач, которые зависят друг от друга, и когда все они завершат что-то еще, используйте модуль async.series(). Ниже показано, как это можно сделать в вашем случае:

exports.findAll = function(req, res) { 
    var locals = {}, 
     section = req.params.section, 
     filter = !!req.query.filter ? {nameToLower: new RegExp('^' + req.query.filter.toLowerCase())} : {}; 
    async.series([ 
     // Connect to DB 
     function(callback) { 
      MongoClient.connect(url, function(err, db) { 
       if (err) return callback(err);    
       locals.collection = db.collection(section); //Set the collection here, so the next task can access it 
       callback(); 
      }); 
     }, 
     // Get count 
     function(callback) { 
      locals.collection.count(filter, function (err, result){ 
       if (err) return callback(err);    
       locals.count = result; //Set the count here 
       callback(); 
      });   
     },  
     // Query collection 
     function(callback) { 
      var cursor = locals.collection.find(filter); 
      if(req.query.order) { 
       cursor = cursor.sort(req.query.order); 
      } 

      if(req.query.limit) { 
       cursor = cursor.limit(req.query.limit); 

       if(req.query.page) { 
        cursor = cursor.skip(req.query.limit * --req.query.page); 
       } 
      } 
      cursor.toArray(function(err, docs) { 
       if (err) return callback(err); 
       locals.docs = docs; 
       callback(); 
      }); 
     } 
    ], function(err) { //This function gets called after the three tasks have called their "task callbacks" 
     if (err) return next(err); 
     // Here locals will be populated with 'count' and 'docs' 
     res.json({ 
      count: locals.count, 
      data: locals.docs 
     }); 
     res.render('user-profile', locals); 
    }); 
}; 
+0

очень хорошо, Чтобы отправить фильтры, чтобы найти, верните мне ошибку: Can canicalize query: BadValue sort должен быть объектом или массивом –

+0

и для закрытия db? –

Смежные вопросы