Merkle-Patricia-Tree调用get方法报is not a function错误排查
错误原因
- 核心问题为参数类型传入错误:你实例化
SecureTrie时传入的第一个参数是文件路径字符串./vortex/root.txt,但模块明确要求首个参数为封装了leveldown的levelup实例,字符串本身不存在get方法,因此触发类型错误。 - 二级问题为概念混淆:你将存储trie根哈希的文本文件,与leveldb的存储实例/路径混淆,
srcRoot对应的是你自行存储根哈希的普通文本文件,不能作为level实例传入trie构造函数。 - 你之前调用
trie.put写入正常,大概率是你写入场景下实例化trie时传入了正确的level实例,仅读取场景下参数传错。
修复步骤
- 确保已安装level依赖:
npm install level
- 提前初始化level实例,注意level实例为异步初始化,需等待就绪后再使用:
// 引入level模块 const { Level } = require('level') // 初始化level数据库,./trie-db为level数据的存储目录,自行指定路径即可 const trieDb = new Level('./trie-db', { valueEncoding: 'buffer' }) // 等待数据库初始化完成 await trieDb.open()
- 修改读取场景下的trie实例化代码,将第一个参数替换为初始化好的level实例:
handleTrie: async (err,data)=>{ if (err) throw err var userBIN = Buffer.from(programData.volatile.modularVariables.user); var root=Buffer.from(data,programData.volatile.modularVariables.encoding.hex); console.log(root); switch(programData.volatile.modularVariables.action){ case 'read': // 替换第一个参数为level实例 const trie = new merkle_patricia_tree_1.SecureTrie(trieDb,root); var result = await trie.get(userBIN); console.log(result) break } },
注意事项
- 读写操作的level实例必须对应同一个存储目录,否则无法读取之前写入的数据
- 所有异步操作需添加
catch块捕获错误,避免出现未处理的Promise rejection报错
内容的提问来源于stack exchange,提问作者4N0M41Y
相关产品推荐
相关产品推荐

