Рефакторинг кода базы данных node.js


У меня есть модель пользователя.

Это в основном нападающие получать/создавать/удалять запросы в своей клиентской базе данных.

Проблема у меня есть обработка ошибок, это кричит не по мне, но я не могу найти элегантный способ, чтобы очистить его.

var UserModel = pd.make(Model, {
    get: function _get(id, cb) {
        // nano is a database client
        this.nano.get(id, 
            // whitelist runs every error through the white list,
            // if it fails (false) throw it
            // if it succeeds (true) pass it to cb
            // if the return value is undefined it does nothing
            error.whitelist(function _errors(err) {
                // getaddrinfo is a random DNS error I have to swallow
                // no clue where the bug comes from, trying again is the easy fix
                if (err.syscall === 'getaddrinfo') {
                    UserModel.get(id, cb);
                } else if (err.error === "not_found") {
                    return true;
                } else {
                    return false;
                }
            }, cb)
        );
    },
    insert: function _create(json, cb) {
        this.nano.insert(json, json._id, 
            error.whitelist(function _errors(err) {
                if (err.syscall === 'getaddrinfo') {
                    UserModel.insert(json, cb);
                } else if (err.error === "conflict") {
                    return true;
                } else {
                    return false;
                }
            }, cb)
        );
    },
    delete: function _delete(name, cb) {
        var that = this;
        this.get(name, function _getRev(err, body) {
            that.nano.destroy(name, body._rev, 
                error.whitelist(function _errors(err) {
                    if (err.syscall === 'getaddrinfo') {
                        UserModel.delete(name, cb);
                    } else {
                        return false;
                    }
                }, cb)
            );
        });
    }
});

ОП, ошибка, нано



674
3
задан 17 ноября 2011 в 09:11 Источник Поделиться
Комментарии
1 ответ

Основываясь на обратной связи с помощью JavaScript чат. Кредит на @Зирак и @Крис

Вы хотите хэш белый перечислены сообщения об ошибках для каждого метода

var whitelistMap = {
"get": ["not_found"],
"insert": ["conflict"],
"delete": []
}

Вы хотите белый обработчик ошибок заводе. Это будет включать "getaddrinfo" код для каждого метода, который в основном попробовать снова срезать.

Он будет проверять, является ли сообщение об ошибке в whitelistMap для этого способ, и если так будет пусть это ошибка руководства.

в противном случае он просто бросает

function makeWhitelistCallback(method, thing, cb) {
return error.whitelist(function _errors(err) {
if (err.syscall === "getaddrinfo") {
UserModel[method](thing, cb);
} else if (whitelistMap[method].indexOf(err.error) !== -1) {
return true;
} else {
return false;
}
}, cb);
}

И остальной код просто вызывает список обратного вызова завод

var UserModel = pd.make(Model,{
get: function _get(id, cb) {
this.nano.get(id,
makeWhitelistCallback("get", id, cb)
);
},
insert: function _create(json, cb) {
this.nano.insert(json, json._id,
makeWhitelistCallback("insert", json, cb)
);
},
delete: function _delete(name, cb) {
var that = this;
this.get(name, function _getRev(err, body) {
that.nano.destroy(name, body._rev,
makeWhitelistCallback("delete", name, cb)
);
});
}
});

1
ответ дан 17 ноября 2011 в 10:11 Источник Поделиться