puppeteer/utils.js
2024-12-21 00:01:42 +08:00

126 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export async function readIndexedDB() {
const databases = await indexedDB.databases();
const allData = [];
for (const db of databases) {
const databaseName = db.name;
// 打开数据库
const request = indexedDB.open(databaseName);
const databaseData = await new Promise((resolve, reject) => {
request.onsuccess = (event) => {
const db = event.target.result;
const transaction = db.transaction(db.objectStoreNames, 'readonly');
const objectStore = transaction.objectStore(db.objectStoreNames[0]);
const cursorRequest = objectStore.openCursor();
const storeData = [];
cursorRequest.onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
storeData.push({ key: cursor.key, value: cursor.value });
cursor.continue();
} else {
resolve(storeData); // 执行 resolve返回数据
}
};
cursorRequest.onerror = (event) => {
reject(event.target.error); // 发生错误时 reject
};
};
request.onerror = (event) => {
reject(event.target.error); // 发生错误时 reject
};
});
// 将数据库数据存入 allData
allData.push({
databaseName,
data: databaseData,
});
}
return allData;
}
export async function writeIndexedDB(jsonData) {
return new Promise((resolve, reject) => {
// 使用 async 函数来处理异步操作
const processDatabase = async (database) => {
try {
// 打开 IndexedDB 数据库
const openRequest = indexedDB.open(database.databaseName, 2);
// 处理数据库版本升级
openRequest.onupgradeneeded = (event) => {
const db = event.target.result;
// 创建对象存储,如果不存在的话
if (!db.objectStoreNames.contains('keyvaluepairs')) {
db.createObjectStore('keyvaluepairs');
}
if (!db.objectStoreNames.contains('local-forage-detect-blob-support')) {
db.createObjectStore('local-forage-detect-blob-support');
}
};
// 处理数据库打开成功
openRequest.onsuccess = async (event) => {
const db = event.target.result;
const table = database.data;
const transaction = db.transaction(['keyvaluepairs'], 'readwrite');
const objectStore = transaction.objectStore('keyvaluepairs'); // 使用硬编码的存储名
console.log(table.value);
let completedOperations = 0;
const totalOperations = table.length;
// 使用 Promise.all 来确保所有的写入操作完成
const writeOperations = table.map((item, index) => {
return new Promise((innerResolve, innerReject) => {
const addObject = objectStore.put(item.value, item.key);
addObject.onsuccess = () => {
console.log('数据添加成功', item.key);
completedOperations++;
// 如果所有操作完成,调用 resolve
if (completedOperations === totalOperations) {
innerResolve('数据写入成功');
}
};
addObject.onerror = (event) => {
console.error('数据添加失败:', event.target.error);
innerReject('数据添加失败');
};
});
});
// 等待所有写入操作完成
try {
await Promise.all(writeOperations);
console.log('所有数据写入完成');
resolve('所有数据写入完成');
} catch (error) {
reject('数据写入失败');
}
};
// 错误处理
openRequest.onerror = (event) => {
console.error('数据库打开失败:', event.target.error);
reject('数据库打开失败');
};
} catch (error) {
reject('数据库操作失败: ' + error);
}
};
// 遍历所有数据库
Promise.all(jsonData.map((database) => processDatabase(database)))
.then(() => resolve('所有数据库操作完成'))
.catch((error) => reject('操作失败: ' + error));
});
}