MongoSkin 의 Promise 스타일 을 기반 으로 한 NodeJS 읽 기와 쓰기 MongoDB.

24421 단어
Promise 는 비동기 프로 그래 밍 의 코드 작성 방식 으로 Async 모듈 과 마찬가지 로 코드 의 가 독성 과 유지 가능성 을 높 일 수 있다.Async 는 Promise 보다 잘 봉 인 됐 지만 유연성, 특히 철저한 CallBack 화 는 Promise 보다 조금 떨 어 질 수 있다.아래 에 소스 코드 를 직접 붙 이 고 설명 이 상세 합 니 다.
(1) 데이터베이스 연결 파일: dbConfig
/**
 * Created by apple on 2014/12/29.
 */
var mongoskin = require('mongoskin');
var db = null;
var dbName = "yqbChat";

/**
 * @function
 * @param collectionName
 * @returns {SkinCollection|null|*}
 */
exports.getCollection = function (collectionName) {
    if (!db) {
        //    mongodb ,         mongoskin.db('username:password@   ip/    
        db = mongoskin.db('mongodb://127.0.0.1:27017/' + dbName + '?auto_reconnect=true&poolSize=3',
            {numberOfRetries: 1, retryMiliSeconds: 500, safe: true, native_parser: true},
            {socketOptions: {timeout: 5000}}
        );
    }
    return db.collection(collectionName);
};

/**
 * @function      
 */
exports.dbClose = function()
{
    if (!db) {
        db.close();
    }
};

(2) Model 계층 파일
/**
 * Created by apple on 2015/1/17.
 */
/**        
 *
 * //                ,         
 * @{singleChatRoomID}
 *  @_id     
 *  @msgState 0-   1-   (int  )
 *  @msgContent     
 *  @msgSend       user_id
 *  @create_time
 *
 */

//  MongoDB     
var moment = require('moment');
var Q = require("q");

//         
var singleChatRoomConfigInstance = null;

//     
var currentDateTime = moment().format("YYYY-M-D H:m:s");

/**
 * @function   singleChatRoomID singleChatRoomConfig         
 * @param singleChatRoomID    ID
 * @param callback         promise  
 * @param promise     promise, callback  
 */
exports.findSingleChatRoomByID = function (data) {

    //  singleChatRoomID          ,            ,    false
    if (singleChatRoomConfigInstance == null) {
        singleChatRoomConfigInstance = data.db.getCollection('singleChatRoomConfig');
    }

    var deferred = Q.defer();
    console.log("[SingleChatRoomConfig->findSingleChatRoomByID]:       ID      !");
    //  
    singleChatRoomConfigInstance.findOne({singleChatRoomID: data.singleChatRoomID}, function (error, result) {

        if (typeof data.promise != undefined) {
            if (!error) {
                data.result = result;
                //console.log(data);
                deferred.resolve(data);
            } else {
                deferred.reject(error);
            }
        }
        else {
            callback(error, data);
        }
        //db.dbClose();
    });

    return deferred.promise;

};

/**
 * @function                
 * @param singleChatRoomID
 * @param user_id_1
 * @param user_id_2
 * @param callback
 * @param promise
 */
exports.insertSingleChatRoomByID = function (data) {
    //  singleChatRoomID          ,            ,    false
    if (singleChatRoomConfigInstance == null) {
        singleChatRoomConfigInstance = data.db.getCollection('singleChatRoomConfig');
    }

    var deferred = Q.defer();
    console.log("[SingleChatRoomConfig->insertSingleChatRoomByID]:      !");
    //console.log(data);
    singleChatRoomConfigInstance.insert(
        {
            singleChatRoomID: data.singleChatRoomID,
            users: [data.user_id_1, data.user_id_2],
            msgCount: 0,
            createTime: currentDateTime
        }, function (error, result) {
            if (typeof data.promise != undefined) {
                if (!error) {
                    data.result = result;
                    deferred.resolve(data);
                } else {
                    deferred.reject(error);
                }
                //db.dbClose();
            }
            else {
                callback(error, result);
                //db.dbClose();
            }

        }
    );
    return deferred.promise;

};

(3) 테스트 파일
/**
 * Created by apple on 2015/1/17.
 */
var singleRoomConfigModel = require('../SingleRoomConfigModel');
var model = require('../Model');
var db = require('../db/dbConfig');
var Q = require("q");

/**
 * @function    singleChatRoomConfig                 ,      
 * @param singleChatRoomID
 */
/**CallBack     */
function testFindAndInsertByID_CALLBACK(singleChatRoomID) {
    //           
    this.findSingleChatRoomByIDCallBack = function (error, result) {

        console.dir("findSingleChatRoomByIDCallBack invoked!" + result);

        //       ,         
        if (result != null) {

        }
        else
        //      ,                   
        {
            singleRoomConfigModel.insertSingleChatRoomByID(singleChatRoomID, 1, 2, this.insertSingleChatRoomByIDCallBack);
        }

    };
    //           
    this.insertSingleChatRoomByIDCallBack = function (error, result) {

        if (error != null) {
            console.log(result);
        }
        else {
            console.error(error);
        }

    };
    singleRoomConfigModel.findSingleChatRoomByID(singleChatRoomID, this.findSingleChatRoomByIDCallBack);
}

/**Promise     */
function testFindAndInsertByID_PROMISE(singleChatRoomID) {

    var data = {
        singleChatRoomID: singleChatRoomID,
        promise: true,
        db:db
    };

    singleRoomConfigModel.findSingleChatRoomByID(data).then(
        /**
         * @function      ,             ,         
         * @param result
         */
        function (data) {
            var deferred = Q.defer();
            if(data) {
                //console.log("     ,       !");
                deferred.resolve(data);
            }
            else{
                //console.log("      ,       !");
                //        promise  
                deferred.reject(data);
            }
            return deferred.promise;
        }
        , model.errorHandler
    ).then(
        function(data){
            //console.log("         !");
            var deferred = Q.defer();
            deferred.resolve(data);
            return deferred.promise;
        },
        singleRoomConfigModel.insertSingleChatRoomByID
    ).done(
        function(data){
            //console.log("testFindAndInsertByID_PROMISE-  ");
            //console.log(data);
            data.db.dbClose()
        },
        model.errorHandler
    );

}

testFindAndInsertByID_PROMISE("1");

좋은 웹페이지 즐겨찾기