PouchDB调用get()报TypeError: cb is not a function如何解决
问题解答
错误原因
- 直接诱因:代码中存在多余的无参数调用
db.get(),PouchDB的get()方法要求至少传入文档ID作为必填参数,不传参数时内部期望的回调函数cb不存在,因此抛出TypeError: cb is not a function错误,删除这行多余调用即可解决该报错。 - 其他潜在错误:
- jQuery对象取值应该用
.val()方法,直接访问.value会得到undefined,导致后续校验永远失败 - 循环逻辑写死
i < 2,当存储的用户数超过2时会漏匹配 - 逗号表达式
var data = ("db value", info);写法冗余,实际等价于var data = info,无额外作用 - 如果你的用户是单独存储为多个文档而非存在同一份数组文档里,用
db.get(table.users)本身也无法获取到所有用户数据,需要替换为db.allDocs()查询全量用户文档。
- jQuery对象取值应该用
优化实现方案
推荐使用async/await语法替换回调写法,逻辑更清晰易读,优化后的代码如下:
const submit = $("input[name='submit']"); async function logIn() { // 修正jQuery取值方式,同时做空格过滤 const username = $("input[name='username']").val().trim(); const password = $("input[name='password']").val().trim(); // 提前做输入合法性校验 if (!username || !password) { console.log("用户名和密码不能为空"); return; } try { // 获取用户列表文档 const userList = await db.get(table.users); // 匹配用户信息 const isValidUser = userList.some(user => user.name === username && user.pass === password); if (isValidUser) { console.log(`${username} 登录成功!`); // 此处可补充登录后逻辑,比如存储登录状态、页面跳转等 } else { console.log("用户名或密码错误"); } } catch (err) { console.error("数据读取失败:", err); } } submit.click(() => logIn());
额外优化建议
- 禁止明文存储密码:生产环境需要用bcrypt等哈希算法对密码加密后再存储,校验时将用户输入的密码做同等哈希处理后再对比,避免数据泄露导致密码明文丢失。
- 适配存储结构:如果你的用户是分文档存储,将
db.get(table.users)替换为db.allDocs({include_docs: true})获取全量用户文档后再匹配即可。
内容的提问来源于stack exchange,提问作者greyowl
相关产品推荐
相关产品推荐

