2015-07-21 2 views
0

Я разрабатываю приложение с express.js и mongodb. Я хочу выполнить следующую задачу. Если база данных доступна, тогда я хочу получить все сообщения, иначе она выдает ошибку. Я использую Q-пакет для обещания. Я не уверен, как я могу сделать следующий код работы. Если есть какой-либо другой способ достичь этого, то помогите мне.Как я могу достичь этого, используя обещания (Q-пакет)?

function getAllPosts(){ 

    var deferred = Q.defer(); 

    db.connectDB().then(function(){ 

    db.posts.find({},function(err,data){ 

     if(err){ 
      deferred.reject(new Error('problem')); 
     }else{ 
      deferred.resolve(data); 
     } 
    }); 

    }).fail(function(err){ 
     console.log(err); 
    }); 

    return deferred.promise; 
} 

Вот мой код для маршрута локального хоста: 3000/сообщений

exports.posts = function(req,res){ 
    postModel.getAllPosts().then(function(data){ 
    res.send(data); 
    }).fail(function(err){ 
    res.send('error'); 
    }); 
} 

Вот мой MongoDB код подключения

function connectDB(){ 
    mongoose.connect('mongodb://localhost/demo'); 
     var deferred = q.defer(); 
    mongoose.connection.on('open',function(){ 
     createTables(); 
     deferred.resolve(); 
    }); 

    mongoose.connection.on('error',function(){ 

     deferred.reject(new Error('Error connecting database')); 
    }); 

    return deferred.promise; 
} 
+0

* Из темы *: Есть ли требование специально использовать ' Q'. Если нет, просто используйте узел v0.12 с флагом '--harmony', чтобы использовать обещания. –

+0

На первый взгляд, похоже, что код в порядке. Какая у вас ошибка? –

+0

@SimoEndre Я могу получить ошибку, когда mongodb не подключен. Но когда я запускаю mongodb и переключаюсь на url localhost: 3000/posts (который, как предполагается, возвращает все сообщения.), Он не возвращает данные. Он просто продолжает загружаться ... – kishan

ответ

0

Я думаю, что проблема в вашем connection метод, потому что вы не создаете экземпляр объекта с отсрочкой с заглавной буквой Q.

Вы должны использовать

var deferred = Q.defer(); 

вместо

var deferred = q.defer(); 

Таким образом, ваш метод подключения должен выглядеть следующим образом:

function connectDB(){ 
    mongoose.connect('mongodb://localhost/demo'); 
    var deferred = Q.defer(); // Q with capital letter 
    mongoose.connection.on('open',function(){ 
     createTables(); 
     deferred.resolve(); 
    }); 

    mongoose.connection.on('error',function(){ 

     deferred.reject(new Error('Error connecting database')); 
    }); 

    return deferred.promise; 
} 
+0

уже пробовали. Думаю, это не вызывает проблемы. – kishan

+0

Если вы попробуете без обещания, это работает? Если вы консолируете 'data', вы получаете некоторые данные? –

+0

есть. без обещаний он регистрирует данные. – kishan

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