Не добавляет записи в PouchDB при повторном использовании одной и той же функции - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь создать базу данных с «пользователями» и их данными в нем. Как ни странно, он не put() новых переменных в нем, когда я пытаюсь в третий раз. Для этого я создаю локальную базу данных dblocal и реплицирую эту базу данных в удаленную базу данных с именем dbremote. Сначала я создаю документ с одной переменной.

function newuser() {
    if (window.document.consent_form.consent_to_share.value) {
        var id = "p" + Date.now() + "-" + Math.floor(Math.random() * 10000);
        var dblocal = new PouchDB(id);
        var consenttoshare = window.document.consent_form.consent_to_share.value;
        document.cookie = id;
        var dbremote = 'http://localhost:5984/experiment';
        dblocal.put({
            _id: id,
            consent: consenttoshare
        });
        dblocal.replicate.to(dbremote, {live: true});
    }
}

Все это работало хорошо, в другом файле js я пытаюсь добавить переменную в тот же документ, выполнив следующую функцию putdb(). Я делаю это следующим образом (как сказано в их документации - правильный путь):

function putdb () {
    if (document.cookie){
        var id = document.cookie;
        var loggedin = "True";

        var dblocal = new PouchDB(id);
        dblocal.get(id).then(function (doc) {
            doc.loggedin = loggedin;
            return dblocal.put(doc);
        }).then(function () {
            return dblocal.get(id);
        }).then(function (doc) {
            console.log(doc);
            var dbremote = 'http://localhost:5984/experiment';
            dblocal.replicate.to(dbremote, {live: true});
        });
    }
}

Это успешно добавило переменную loggedin в документ, как я хотел. Однако при попытке добавить информацию к этому документу в третий раз (снова в другом файле js) ничего не происходит. Я использовал точно такой же подход, как и раньше, но использовал только разные переменные.

function putdb (checked) {
    if (document.cookie) {
        var id = document.cookie;
        var checkedlist = [];    
        for (i = 0; i < checked; i++) {
            checkedlist.push($("input[type=checkbox]:checked")[i].value)
        }
        var playlistname = document.getElementById("playlistname").value;

        var dblocal = new PouchDB(id);
        dblocal.get(id).then(function (doc) {
            doc.checkedlist = checkedlist;
            doc.playlistname = playlistname;
            return dblocal.put(doc);
        }).then(function () {
            return dblocal.get(id);
        }).then(function (doc) {
            console.log(doc);
            var dbremote = 'http://localhost:5984/experiment';
            dblocal.replicate.to(dbremote, {live: true});
        });
    }
}

Я проверил все переменные, они верны. Я пробовал простые текстовые переменные. Скрипт работает. Я попытался добавить информацию в документ так, как делал это в первый раз. Ничто из этого не добавляет другой переменной документа, как я хотел в последней функции. Я думаю, что это связано с тем, как работает pouchDB, чего я не знаю. помощь очень ценится!

1 Ответ

3 голосов
/ 30 января 2020

В вашем коде есть ряд проблем, которые приводят к неправильному использованию PouchDB и могут привести к проблемам.

Прежде всего, бессмысленно давать документу то же самое идентификатор в качестве имени вашей базы данных. Предполагая, что вы хотите использовать одну базу данных для каждого пользователя, вы можете использовать два подхода:

Подход с несколькими документами Вместо этого вы можете создать несколько документов в одной базе данных с разными идентификаторами. Например, информация о вашем согласии может храниться так:

var id = "p" + Date.now() + "-" + Math.floor(Math.random() * 10000);
let dblocal = new PouchDB(id);
document.cookie = id;
let dbremote = 'http://localhost:5984/experiment';
dblocal.put({
    _id: "consent",
    consent: window.document.consent_form.consent_to_share.value
});
dblocal.replicate.to(dbremote, {live: true});

В то время как информация о вашем списке воспроизведения хранится так:

dblocal.put({
    _id: "playlist",
    name: playlistname,
    itemsChecked: checkedlist
});

Подход с одним документом Второй вариант - хранить один документ, содержащий всю информацию, которую вы хотите сохранить, которая связана с пользователем. При таком подходе вы захотите получить существующий документ и обновить его при появлении новой информации. Предполагая, что вы назвали свой документ global-state (т.е. замените «согласие» в первом фрагменте кода на «глобальное состояние»), следующий код обновит документ:

dblocal.get("global-state").then((doc)=>{
    doc.loggedIn = true; // or change any other information you want
    return dblocal.put(doc);
}).then((response)=>{
    //handle response
}).catch((err)=>{
    console.log(err);
});

Кроме того, вам следует только вызвать

dblocal.replicate.to(dbremote, {live: true});

работает один раз, потому что опция 'live' указывает, что будущие изменения будут автоматически реплицироваться в удаленную базу данных.

...