我正在尝试使用一个 npm 包,即 ESM https://www.npmjs.com/package/key-did-resolver
安装后我不能要求'key-did-resolver'包,因为它是ESM,所以我尝试使用异步导入加载
我最终想要实现的逻辑就像包中提到的那样
import * as KeyDidResolver from 'key-did-resolver'
import {Resolver} from 'did-resolver'
const keyDidResolver = KeyDIDResolver.getResolver()
console.log(keyDidResolver)
const didResolver = new Resolver(keyDidResolver)
const doc = await didResolver.resolve('did:key:z6MktvqCyLxTsXUH1tUZncNdVeEZ7hNh7npPRbUU27GTrYb8')
console.log(doc)
console.log(doc.didDocument.verificationMethod)
所以我尝试在节点应用程序中将 JS 类文件导入为
const {Resolver} = require('did-resolver'); // commonJs supported
const didResolve = (...args) => import('key-did-resolver').then(({default: resolver}) => {const didResolver = new Resolver(resolver.getResolver);return didResolver.resolve(...args) });
在其中一个类函数中我试图调用它:
async myresolve(didKey){
try {
await didResolve([didKey]);
} catch (err) {
console.error('Error importing key-did-resolver:', err);
}
}
因此,当我启动服务器时,它已启动,但是当我执行流程应用程序时,它会在遇到“await didResolve([didKey]);”时崩溃
我使用的是节点16
如何使用 const didResolve =...etc 加载的包
问题识别
const divResolve
是由 then
在其赋值的 Promise 链中返回的 promise 对象:
const didResolve = (...args) =>
import('key-did-resolver')
.then( ({default: resolver}) => {
const didResolver = new Resolver(resolver.getResolver);
return didResolver.resolve(...args)
}
);
当无错误地履行时,将保留所承诺的值:
didResolver.resolve(...args)
。
讨论
await didResolve([didKey]);
应该抛出运行时错误,因为 didResolve
不是函数。
如果节点中的主模块是 CommonJS 模块,则无法在启动时运行的同步代码中显式或隐式调用从 ES6 模块导入的任何代码,因为导入处理尚未完成。
潜在的解决方案
如果要维持混合使用 ES6/CommonJS 模块,有两种主要方法可以解决该问题:
将当前主模块中的所有应用程序代码放入其自己的应用程序模块中。还要编写一个新的主 (CommonJS) 模块,使用
import()
加载所有 ES6 模块,并等待所有模块加载完毕,然后再请求应用程序模块并向其传递一个模块的单个导入值,或为该模块传递一个命名空间对象。默认导出多个 ES6 模块。
同1,但是用ES6编写主模块并使用module.createRequire(filename)`
调用应用程序模块