Node.js 16下CommonJS异步加载ESM包key-did-resolver报错求助
解决Node.js 16中异步加载ESM包key-did-resolver的问题
问题背景
在Node.js 16的CommonJS项目中,尝试加载ESM规范的key-did-resolver包时,使用异步import的方式触发代码崩溃,无法正常解析DID。
错误原因分析
你的代码存在三个关键问题:
- 异步
import时错误获取了default导出,但key-did-resolver的getResolver是命名导出,不是默认导出 - 未调用
getResolver()函数,直接将函数本身传给了Resolver构造函数(缺少执行括号) - 调用
didResolve时传递了数组参数,但resolve方法需要的是字符串类型的DID值
修复方案
方案1:在CommonJS中正确异步加载
修正异步加载逻辑,正确获取命名导出并执行getResolver,同时传递正确的参数:
const { Resolver } = require('did-resolver'); // 正确封装DID解析逻辑 const didResolve = async (didKey) => { // 加载ESM包并获取命名导出的getResolver函数 const { getResolver } = await import('key-did-resolver'); // 执行getResolver获取解析器配置对象 const keyDidResolver = getResolver(); // 实例化Resolver并传入配置 const didResolver = new Resolver(keyDidResolver); // 调用resolve方法,传入字符串类型的DID return didResolver.resolve(didKey); }; // 类中的调用方法 class YourClass { async myresolve(didKey) { try { // 直接传递DID字符串,而非数组 const doc = await didResolve(didKey); console.log(doc); console.log(doc.didDocument.verificationMethod); } catch (err) { console.error('Error resolving DID:', err); } } }
方案2:转为ESM模块(更推荐)
Node.js 16完全支持ESM模块,直接将项目转为ESM可以避免异步加载的麻烦:
- 在项目根目录的
package.json中添加:
{ "type": "module" }
- 直接使用ESM的
import语法编写代码:
import { getResolver } from 'key-did-resolver'; import { Resolver } from 'did-resolver'; class YourClass { async myresolve(didKey) { try { const keyDidResolver = getResolver(); const didResolver = new Resolver(keyDidResolver); const doc = await didResolver.resolve(didKey); console.log(doc); console.log(doc.didDocument.verificationMethod); } catch (err) { console.error('Error resolving DID:', err); } } }
验证
调用myresolve方法时传入正确的DID字符串,比如:
const instance = new YourClass(); instance.myresolve('did:key:z6MktvqCyLxTsXUH1tUZncNdVeEZ7hNh7npPRbUU27GTrYb8');
此时应该能正常输出DID文档和验证方法信息。
内容的提问来源于stack exchange,提问作者Mostafa0707
相关产品推荐
相关产品推荐

