解决Ionic/Angular中PouchDB报错‘Document must be a JSON object’问题
问题分析与解决
嘿,这个问题我之前也踩过类似的坑!核心原因是你误解了PouchDB put() 方法的参数要求——它需要的是原生JavaScript对象,而不是你提前转好的JSON字符串。
为什么会报错?
你提到“JSON不就是字符串吗?”,这点没错,但PouchDB内部会自动负责把JS对象序列化为JSON字符串存储,它根本不需要你提前手动转好。当你把JSON.stringify()得到的字符串传给put()时,PouchDB会把这个字符串当成一个普通的字符串值,而不是它期望的文档对象,所以才会抛出“Document must be a JSON object”的错误。
修正方法
你完全可以跳过手动转JSON字符串的步骤,直接把TodoModel的实例传给put()。不过要注意:类的实例会带有原型链上的属性,PouchDB可能会把这些也存进去(大部分时候不影响,但追求干净的话可以处理一下),这里给你两种方案:
方案1:直接传入类实例
createTodo(todo : TodoModel) { // 直接传TodoModel实例,PouchDB会自动完成序列化操作 this.db.put(todo); }
方案2:转成纯JS对象(更稳妥)
createTodo(todo : TodoModel) { // 把类实例转成无原型链的纯对象,避免额外属性被存储 const todoObj = {...todo}; this.db.put(todoObj); }
额外说明
你之前写的todoToJson方法其实是多余的,反而帮了倒忙。以后记住:JSON.stringify()是把JS对象转成JSON字符串,JSON.parse()是把JSON字符串转回JS对象——而PouchDB的put()和get()方法已经帮你封装了这两个步骤,不需要手动操作。
内容的提问来源于stack exchange,提问作者darzang
相关产品推荐
相关产品推荐

