2016-11-15 3 views
1

Этот вопрос следует этому вопросу: node.js: how to return a value of a callback function?Bluebird.Promisify - Как правильно создать цепочку обещаний?

Я решил написать код в предыдущем вопросе, используя Bluebird.promisify. Это то, что я писал:

var express = require('express') 
var app = express() 
var MongoClient = require('mongodb').MongoClient; 
var db = require('./db.js') 
var Promise = require('bluebird'); 

app.get('/', function(req, res){ 
    var result = Promise.promisify(db.get_document); 
    result().then(function(doc) { 
     res.send(doc); 
     console.log("end"); 
    }); 
}); 

app.listen(3000, function(req, res) { 
    console.log("Listening on port 3000"); 
}); 

function get_document() { 
    var connect = Promise.promisify(MongoClient.connect); 
    connect(url).then(function(err,db) { 
    var col = db.collection('myinterviews'); // !!! ERROR!!! 'db' undefined 
    return col.find().toArray 
    }).then(function (err, docs) { 
    db.close(); 
    return docs[0].name; 
    }); 
}; 

Линия:

var col = db.collection('myinterviews');

выдает сообщение об ошибке:

"Unhandled rejection TypeError: Cannot read property 'collection' of undefined."

Функция MongoClient.connect принимает функцию обратного вызова с двумя аргументами, так почему 'db' undefined?

+0

Я не вижу, как MongoClient определяется где угодно, это может быть проблемой. где задан url. – anwerj

+0

Я пропустил это, когда скопировал код. Я отредактировал оригинальный пост. – CrazySynthax

+0

Где вы называете 'get_document'? – Bergi

ответ

0

Обещание не передает ошибки и результат к тому же методу. Вы должны добавить catch, чтобы получить ошибку.

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

var express = require('express') 
var app = express() 
var MongoClient = require('mongodb').MongoClient; 
var Promise = require('bluebird'); 

app.get('/', function(req, res){ 

    var result = Promise.promisify(get_document); 
    result().then(function(doc) { 
     res.send(doc); 
     console.log("end"); 
    }).catch(function(err){ 
     console.log(err); 
     res.status(500).send(err.toString()); 
    }); 
}); 

app.listen(3000, function(req, res) { 
    console.log("Listening on port 3000"); 
}); 

function get_document (callback) { 
    return Promise.promisify(MongoClient.connect)(YOUR_URL) 
    .then(function(db){ 
     return db.collection(YOUR_COLLECTION).find().toArray(); 
    }) 
    .then(function (docs) { 
     return callback(null, docs[0].name); 
    }).catch(function(err){ 
     return callback(err); 
    }); 
}; 
+0

Теперь я получаю сообщение об ошибке «db.close()», говорящий: «db не определен» – CrazySynthax

+0

Это потому, что db отсутствует во второй функции. Это js 101. – anwerj

+0

ОК. поэтому также, когда я удаляю строку «db.close», docs [0] .name не передается в res.send (doc). – CrazySynthax

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