CouchApps и аутентификация пользователя

Вы на правильном пути с Object.entries. Вы можете использовать деструктуризацию, чтобы выбрать ключ ('222', '333') и массив объекта значения items, затем использовать этот массив для фильтрации stateItems и создать массив items для каждой записи в результате:

const result = {};
for (const [key, {items}] of Object.entries(response.data.results)) {
    result[key] = {
        items: stateItems.filter(item => items.includes(item.id))
    };
}

Live Пример:

//backend response
const response = {
    data: {
        results: {
            222: {
                items: ['id1', 'id3']
            },
            333: {
                items: ['id2', 'id4', 'id999 (UNKNOWN)']
            }
        }
    }
};

//currently saved in redux state
const stateItems = [
    {
        id: 'id1',
        name: 'item ONE'
    }, {
        id: 'id2',
        name: 'item TWO'
    }, {
        id: 'id3',
        name: 'item THREE'
    }, {
        id: 'id4',
        name: 'item FOUR'
    }, {
        id: 'id5',
        name: 'item FIVE (UNUSED)'
    }, {
        id: 'id6',
        name: 'item SIX (UNUSED)'
    }
];


const result = {};
for (const [key, {items}] of Object.entries(response.data.results)) {
    result[key] = {
        items: stateItems.filter(item => items.includes(item.id))
    };
}

//final result should be:
const expectedFinalResult = {
    222: {items: [{id: 'id1', name: 'item ONE'}, {id: 'id3', name: 'item THREE'}]},
    333: {items: [{id: 'id2', name: 'item TWO'}, {id: 'id4', name: 'item FOUR'}]}
};

//both should be equal:
console.log(JSON.stringify(result, null, 4));
.as-console-wrapper {
  max-height: 100% !important;
}

, который делает несколько проходов через stateItems , Если он или response.data.results действительно, действительно, действительно, очень большой (например, сотни тысяч), может быть целесообразно вместо этого сделать Map из stateItem с помощью id:

// Create map of state items (only once each time stateItems changes):
const stateItemMap = new Map(stateItems.map(item => [item.id, item]));

// Map results (each time you get results):
const result = {};
for (const [key, {items}] of Object.entries(response.data.results)) {
    result[key] = {
        items: items.map(id => stateItemMap.get(id))
    };
}

Live Пример:

//backend response
const response = {
    data: {
        results: {
            222: {
                items: ['id1', 'id3']
            },
            333: {
                items: ['id2', 'id4', 'id999 (UNKNOWN)']
            }
        }
    }
};

//currently saved in redux state
const stateItems = [
    {
        id: 'id1',
        name: 'item ONE'
    }, {
        id: 'id2',
        name: 'item TWO'
    }, {
        id: 'id3',
        name: 'item THREE'
    }, {
        id: 'id4',
        name: 'item FOUR'
    }, {
        id: 'id5',
        name: 'item FIVE (UNUSED)'
    }, {
        id: 'id6',
        name: 'item SIX (UNUSED)'
    }
];

// Create map of state items (only once each time stateItems changes):
const stateItemMap = new Map(stateItems.map(item => [item.id, item]));

// Map results (each time you get results):
const result = {};
for (const [key, {items}] of Object.entries(response.data.results)) {
    result[key] = {
        items: items.map(id => stateItemMap.get(id))
    };
}

//final result should be:
const expectedFinalResult = {
    222: {items: [{id: 'id1', name: 'item ONE'}, {id: 'id3', name: 'item THREE'}]},
    333: {items: [{id: 'id2', name: 'item TWO'}, {id: 'id4', name: 'item FOUR'}]}
};

//both should be equal:
console.log(JSON.stringify(result, null, 4));
.as-console-wrapper {
  max-height: 100% !important;
}

37
задан Ryan Duffield 19 February 2010 в 22:10
поделиться

1 ответ

CouchDB выпустил API простой аутентификации, но имеет не в созданных механизмах аутентификации на данный момент. Самый простой и легкий способ сделать это должно использовать прокси HTTP для аутентификации. Однако это имеет ограничения на то, насколько можно ограничить доступ на на основание документа. Когда CouchDB получает еще некоторую поддержку встроенных модулей аутентификации затем, это должно быть легче.

, Если Вы хотите попробовать силы в кодировании модуля аутентификации затем, можно проверить источник для JavaScript security_validation тесты в этом файле: http://svn.apache.org/repos/asf/couchdb/trunk/share/www/script/couch_tests.js

и default_authentication_handler в этом файле здесь: http://svn.apache.org/repos/asf/couchdb/trunk/src/couchdb/couch_httpd.erl

, который запустил бы Вас так или иначе.

10
ответ дан Jeremy Wall 27 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: