Node.js
16.14.2,npm
8.19.2.
我正在尝试运行一个导入
Node.js
的简单 OrbitDB
脚本。这是脚本:
hello_orbitdb.js
// import the package
const OrbitDB = require('orbit-db');
这是我尝试运行它的方式,以及我收到的错误:
$ node hello_orbitdb.js
node:internal/modules/cjs/loader:488
throw e;
^
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './cid' is not defined by "exports" in /node_modules/multiformats/package.json
at new NodeError (node:internal/errors:371:5)
at throwExportsNotFound (node:internal/modules/esm/resolve:453:9)
at packageExportsResolve (node:internal/modules/esm/resolve:671:7)
at resolveExports (node:internal/modules/cjs/loader:482:36)
at Function.Module._findPath (node:internal/modules/cjs/loader:522:31)
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/node_modules/orbit-db/src/orbit-db-address.js:3:17) {
code: 'ERR_PACKAGE_PATH_NOT_EXPORTED'
}
所以我看了一下
/node_modules/orbit-db/src/orbit-db-address.js
,它是这样开始的:
'use strict'
const path = require('path')
const { CID } = require('multiformats/cid')
我该如何纠正这个错误?
在我的
node_modules
文件夹里,有
"name": "orbit-db",
"version": "0.28.7",
和
"name": "multiformats",
"version": "10.0.2",
你的问题听起来像是依赖性问题。
首先,尝试删除node_modules目录并发出
npm install
以重新导入依赖项。
如果问题仍然存在,请发出
npm install --save [email protected]
并查看这是否可以解决您的问题。
您的主要问题是
orbit-db
依赖于 multiformats
,自从 v1.0.0
以来它一直是 ES 模块,但是您展示的 orbit-db
的源代码有
const { CID } = require('multiformats/cid')
和 ES 模块只能通过动态
import()
语句加载到 CommonJS 模块内部。请参阅有关 ES 模块的 Node.js 文档 与 CommonJS 模块的互操作性有关 require
。
不支持使用require加载ES模块,因为ES模块是异步执行的。相反,使用 import() 从 CommonJS 模块加载 ES 模块。
您必须打开一个 PR,将
require
更新为动态 import('multiformats/cid')
。最佳位置可能是 在这个 try
块中,但是随后您会将 static isValid
方法的 API 从同步更改为异步。这并不是一个巨大的努力,似乎没有在许多地方使用,并且 API 似乎是内部的,即不面向公众。
不过,您可能更喜欢更简单的路线,并将您的
orbit-db
版本降级为 v0.26.0
,其中 使用较旧的 cids
包,即 CommonJS。
更新
orbit-db
的 package.json 条目:
"orbit-db": "^0.26.0"
重新安装:
npm i
在我的代码中,有一行我不记得放入过,这就是导致此问题的原因。
const { underscoredIf } = require('sequelize/types/utils');
可能 vscode 纠正了我输入的内容,并且出现了这一行。