async import() 函数可异步加载 ESM:

问题描述 投票:0回答:1

我正在尝试使用一个 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

enter image description here

如何使用 const didResolve =...etc 加载的包

javascript node.js import es6-modules commonjs
1个回答
0
投票

问题识别

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 模块,有两种主要方法可以解决该问题:

  1. 将当前主模块中的所有应用程序代码放入其自己的应用程序模块中。还要编写一个新的主 (CommonJS) 模块,使用

    import()
    加载所有 ES6 模块,并等待所有模块加载完毕,然后再请求应用程序模块并向其传递一个模块的单个导入值,或为该模块传递一个命名空间对象。默认导出多个 ES6 模块。

  2. 同1,但是用ES6编写主模块并使用module.createRequire(filename)`

    调用应用程序模块
© www.soinside.com 2019 - 2024. All rights reserved.