Javascript 未捕获类型错误:无法读取属性';交易';未定义的

Javascript 未捕获类型错误:无法读取属性';交易';未定义的,javascript,Javascript,我在控制台中不断收到以下消息: 未捕获的TypeError:无法读取未定义的属性“transaction” 我尝试过删除数据库,重新启动live server,将add()移动到onsuccess中,但我不太清楚该怎么做。这一行对我来说似乎没问题:consttransaction=DB.transaction(['crm'],'readwrite')我检查过的其他答案令人困惑 (函数(){ 让DB; const form=document.querySelector(“#form”); docu

我在控制台中不断收到以下消息:

未捕获的TypeError:无法读取未定义的属性“transaction”

我尝试过删除数据库,重新启动live server,将
add()
移动到onsuccess中,但我不太清楚该怎么做。这一行对我来说似乎没问题:
consttransaction=DB.transaction(['crm'],'readwrite')我检查过的其他答案令人困惑

(函数(){
让DB;
const form=document.querySelector(“#form”);
document.addEventListener('DOMContentLoaded',()=>{
conectDB();
表格。addEventListener(“提交”,验证);
});
函数验证(e){
e、 预防默认值();
//读取所有输入
const name=document.querySelector('#name').value;
const email=document.querySelector(“#email”).value;
const phone=document.querySelector(“#phone”).value;
const company=document.querySelector(“#company”).value;
如果(姓名==''电子邮件==''电话==''公司==''){
alertMessage('所有字段都是必需的','错误');
返回;
}
//创建一个包含信息的对象
常量客户端={
名称
电子邮件,
电话,
公司,
id:Date.now()
}
console.log(客户端)
createNewClient(客户端);
}
函数createNewClient(客户端){
const transaction=DB.transaction(['crm'],'readwrite');
const objectStore=transaction.objectStore('crm');
//console.log(objectStore);
objectStore.add(客户端);
transaction.onerror=函数(){
alertMessage('无效输入

我可以通过做一些修复来创建一个新的客户端。请看,我对您的newClient.js文件做了一些更改。主要问题是,即使我们将变量
DB
传递给函数
conectDB()
作为一个参数,它唯一会被赋值的时间是与数据库的连接成功时,对吗?这就是函数
createNewClient()的问题
在与数据库的连接成功之前执行,因此我们需要做的是在与数据库的连接成功后调用函数
createNewClient()
因此,一旦到数据库的连接成功,我们需要调用函数
createNewClient()
,一种方法是调用函数
createNewClient()
onsuccess
方法中,正如我在下面的代码中所做的那样。我必须对
newClient.js
文件进行一些本地更改,但至少现在您的问题已经解决,您可以根据需要重构代码

记住这一点,一旦成功连接到数据库,调用
createNewClient()
函数

var-DB;
const form=document.querySelector(“#form”);
document.addEventListener('DOMContentLoaded',()=>{
表格。addEventListener(“提交”,验证);
});
函数验证(e){
e、 预防默认值();
//读取所有输入
const name=document.querySelector('#name').value;
const email=document.querySelector(“#email”).value;
const phone=document.querySelector(“#phone”).value;
const company=document.querySelector(“#company”).value;
如果(姓名==''电子邮件==''电话==''公司==''){
alertMessage('所有字段都是必需的','错误');
返回;
}
//创建一个包含信息的对象
常量客户端={
名称
电子邮件,
电话,
公司,
id:Date.now()
}
console.log(客户端)
//createNewClient(客户端);
conectDB(客户);
}
函数conectDB(客户端){
让openconction=window.indexedDB.open('crm',4);
openconction.onerror=函数(){
console.log('错误')
}
openconction.onsuccess=(事件)=>{
DB=event.target.result;
createNewClient(客户端);
};
}
函数createNewClient(客户端){
const transaction=DB.transaction(['crm'],'readwrite');
const objectStore=transaction.objectStore('crm',{keyPath:'id',autoIncrement:true});
//console.log(objectStore);
objectStore.add(客户端);
transaction.oncomplete=函数(){

alertMessage('添加的客户端您的意思是
const transaction=DB.transaction(['crm'],'readwrite'))
这一行产生了问题。好吧,我通过查看您的代码发现变量
DB
从未分配到任何地方,所以它怎么可能有属性
transaction
。在这一行
const transaction=DB.transaction(['crm','readwrite');
之前,请尝试
console.log(DB);
并告诉我它是否将
未定义的
放在屏幕上。如果它将
未定义的
放在屏幕上,这意味着您从未分配变量
DB
值,并且您正试图访问
未定义的
值上的属性。什么是
connectDB()
function do?您能提供详细信息吗?[code github]()我为您的问题发布了一个解决方案。谢谢您的帮助。它不起作用。我仍然无法读取未定义的属性“transaction”。我会继续处理它,不会退出问题是function
createNewClient()
在成功连接到数据库之前被调用,因此永远不会分配变量
DB