MongoDB自定义包装器代码检查:我写的是好的代码吗?

时间:2016-02-01 15:41:38

标签: node.js es6-promise

我想知道我在这里编写的代码是否理智且遵循非阻塞规则,我来自Java背景,因此我对Node.js的非阻塞事件循环不熟悉

retard.js:

var MongoClient = require('mongodb').MongoClient;

var retard = {};

retard.getDb = function (url) { // url example 'mongodb://localhost:27017/myproject'
    return new Promise(function (resolve, reject) {
        MongoClient.connect(url, function (err, db) {
            if (err)
                throw err;

            // custom functions
            db.getCollection = function (mCollection) {
                var obj = {};

                var collection = db.collection(mCollection);
                // access to the native drivers
                obj.native = collection;

                obj.findOne = function (query) {
                    return new Promise(function (resolve, reject) {
                        collection.findOne(query, function (err, result) {
                            if (err)
                                throw err;
                            resolve(result);
                        });
                    });
                };

                return obj;
            };
            resolve(db);
        });
    });
};

module.exports = retard;

然后将使用以下内容:

var co = require('co');
var config = require('./config');
var retard = require('./lib/retard');

co(function* () {
    var db =
        yield retard.getDb(config.mongodb.url);
    var countries = db.getCollection('countries');

    // first query
    var doc =
        yield countries.findOne({
            country: 'scotland'
        });
    console.log(JSON.stringify(doc));

    // second query
    countries.native.findOne({
        country: 'scotland'
    }, function (err, result) {
        if (err)
            throw err;
        console.log(JSON.stringify(result));
    });

});

我得到了我期望从数据库得到的结果,所以它可以工作。我很好奇这是否可以 JavaScripting

1 个答案:

答案 0 :(得分:0)

几乎就在那里!需要记住的是,如果没有传递回调(m findone),mongodb驱动程序方法已经返回Promise。 您可以按如下方式返回方法本身(Promise),而不是使用新的Promise包装方法:

    return collection.findOne(query)

而不是:

     return new Promise(function (resolve, reject) {
                    collection.findOne(query, function (err, result) {
                        if (err)
                            throw err;
                        resolve(result);
                    });
                });

同样适用于MongoClient.connect();