错误 [ERR_PACKAGE_PATH_NOT_EXPORTED]:包子路径未由“exports”定义

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

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",
javascript node.js node-modules package.json es6-modules
3个回答
7
投票

你的问题听起来像是依赖性问题。

首先,尝试删除node_modules目录并发出

npm install
以重新导入依赖项。

如果问题仍然存在,请发出

npm install --save [email protected]
并查看这是否可以解决您的问题。


4
投票

您的主要问题是

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

0
投票

在我的代码中,有一行我不记得放入过,这就是导致此问题的原因。

const { underscoredIf } = require('sequelize/types/utils');
可能 vscode 纠正了我输入的内容,并且出现了这一行。

© www.soinside.com 2019 - 2024. All rights reserved.