Javascript 重复使用同一功能时,不会将记录添加到数据库中
我正在尝试创建一个包含用户及其数据的数据库。奇怪的是,当我第三次尝试时,它并没有加入新的变量。为此,我创建了一个本地数据库dblocal,并将该数据库复制到名为dbremote的远程数据库。首先,我用一个变量创建一个文档Javascript 重复使用同一功能时,不会将记录添加到数据库中,javascript,couchdb,pouchdb,Javascript,Couchdb,Pouchdb,我正在尝试创建一个包含用户及其数据的数据库。奇怪的是,当我第三次尝试时,它并没有加入新的变量。为此,我创建了一个本地数据库dblocal,并将该数据库复制到名为dbremote的远程数据库。首先,我用一个变量创建一个文档 function newuser() { if (window.document.consent_form.consent_to_share.value) { var id = "p" + Date.now() + "-" + Math.floor(Ma
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});
});
}
}
我检查了所有变量,它们都是正确的。
我尝试了纯文本变量。
脚本确实在运行。
我试图像第一次那样向文档中添加信息。
所有这些似乎都没有像我在上一个函数中希望的那样向文档中添加另一个变量。我认为这与PockDB的工作方式有关,我不知道。非常感谢您的帮助 您的代码中存在许多问题,这些问题会导致BackDB的错误使用,并可能导致出现问题 首先,为文档指定与数据库名称相同的id没有多大意义。假设您想要一个每个用户一个数据库的方法,那么有两种方法可以遵循 多文档方法 您可以在同一数据库中创建多个具有不同id的文档。例如,您的“同意”信息可能存储如下:
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
});
当您的播放列表信息按如下方式存储时:
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
});
单文件方法
第二个选项是存储单个文档,其中包含要存储的与用户关联的所有信息。在这种方法中,您需要获取现有文档,并在有新信息时更新它。假设您将文档命名为全局状态,即将第一个代码段中的同意替换为全局状态,则以下代码将更新文档:
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”选项指定将来的更改将自动复制到远程数据库。您的代码中存在许多问题,这些问题会导致数据库的错误使用,并可能导致问题 首先,为文档指定与数据库名称相同的id没有多大意义。假设您想要一个每个用户一个数据库的方法,那么有两种方法可以遵循 多文档方法 您可以在同一数据库中创建多个具有不同id的文档。例如,您的“同意”信息可能存储如下:
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
});
当您的播放列表信息按如下方式存储时:
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
});
单文件方法
第二个选项是存储单个文档,其中包含要存储的与用户关联的所有信息。在这种方法中,您需要获取现有文档,并在有新信息时更新它。假设您将文档命名为全局状态,即将第一个代码段中的同意替换为全局状态,则以下代码将更新文档:
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”选项指定将来的更改将自动复制到远程数据库。随着时间的推移,这样创建和忘记本地数据库可能会造成大量废弃的IndexedDB小袋实例浪费用户空间。为所有用户使用具有一致名称的单个数据库。另外,你的id有风险,所以准备好处理409。因为您的ID不传递信息,所以考虑使用或类似。结果,问题是由于异步代码。函数没有完全检索到承诺,但已经进入下一页。随着时间的推移,创建和忘记本地数据库可能会造成大量废弃的IndexedDB小袋实例,从而浪费用户空间。为所有用户使用具有一致名称的单个数据库。另外,你的id有风险,所以准备好处理409。因为您的ID不传递信息,所以考虑使用或类似。结果,问题是由于异步代码。该函数未完全检索承诺,但已转到下一页。是否有首选方法将用户保存到数据库?每个用户本身都有一个数据库,或者每个用户都是数据库中的文档。@KenGeelhoed这取决于您的项目规范。如果插入的数据在应用程序过程中发生更改,则更适合使用全局状态并更新此状态。如果您的数据大多是静态的,例如日志文件,那么创建新文档就容易多了。是否有更好的方法将用户保存到数据库中?任何一个
每个用户本身都有一个数据库,或者每个用户都是数据库中的文档。@KenGeelhoed这取决于您的项目规范。如果插入的数据在应用程序过程中发生更改,则更适合使用全局状态并更新此状态。如果您的数据大多是静态的,例如日志文件,那么创建新文档就容易多了。