react-native 包指定了一个主模块 https 模块
Posted
技术标签:
【中文标题】react-native 包指定了一个主模块 https 模块【英文标题】:react-native package specifices a main module https module 【发布时间】:2021-02-19 04:19:38 【问题描述】:我做了一个测试项目,只尝试包含 https。我用expo init test
初始化项目,然后npm install https
安装库。
然后我编辑了 App.js 并在最顶部添加了这一行:import https from 'https';
终于expo start
启动了expo server。
现在我收到以下错误:
InternalError Metro has encountered an error: While trying to resolve module `https` from file `/path/test/App.js`, the package `/path/test/node_modules/https/package.json` was successfully found. However, this package itself specifies a `main` module field that could not be resolved (`/path/test/node_modules/https/index.js`. Indeed, none of these files exist:
* /path/test/node_modules/https/index.js(.native|.android.expo.ts|.native.expo.ts|.expo.ts|.android.expo.tsx|.native.expo.tsx|.expo.tsx|.android.expo.js|.native.expo.js|.expo.js|.android.expo.jsx|.native.expo.jsx|.expo.jsx|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json|.android.wasm|.native.wasm|.wasm)
* /path/test/node_modules/https/index.js/index(.native|.android.expo.ts|.native.expo.ts|.expo.ts|.android.expo.tsx|.native.expo.tsx|.expo.tsx|.android.expo.js|.native.expo.js|.expo.js|.android.expo.jsx|.native.expo.jsx|.expo.jsx|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json|.android.wasm|.native.wasm|.wasm)
我已经验证这些文件确实不存在,这里是ls node_modules/https的输出:package.json
所以我猜我在安装过程中做错了什么,但是,我不知道是什么。 (我也尝试过多次使用yarn add https
安装,我得到了同样的错误)
【问题讨论】:
安装https
库后是否重启了metro?
@MaksymBezruchko 是的。
您是否尝试将其作为默认模块导入:import https from 'https';
?
@MaksymBezruchko 是的。
【参考方案1】:
您想要的https
模块几乎可以肯定是Node.js 内置的https
模块,绝对不是the six-year-old https
npm module with no documentation or code and merely a lone package.json file。该软件包可能应该被弃用,这样人们就不会犯这个完全可以理解的错误。
简而言之,试试npm uninstall https
看看您的代码是否开始工作。应该会的。
如果不是并且您确实需要一些外部模块,那绝对不是 那个 模块。看看那里有许多很棒的 http/https 模块之一。 @Nitish 在他们的回答中建议 axios,这是一个受欢迎且可靠的选择。
import Agent from 'https';
应该与内置的 https
模块一起使用,前提是您使用的是相当新的 Node.js 版本。 (您可以通过将该行代码放入 index.mjs
文件并运行 node index.mjs
来快速测试您的 Node.js 版本。如果没有错误消息,则它可以工作。)
免责声明:我对expo
一无所知。这都是从 Node.js/npm
的角度来看的。
【讨论】:
你说得对,我没有意识到这是两件不同的事情。问题是我使用的是 react native,而不是标准的 nodejs,并且 react native 不包含节点标准库。我已经在使用 axios,但似乎我需要 https 来传递 axios 和 https 代理以允许通过自签名 ssl 的请求。我会继续寻找一种不同的方式来配置它。【参考方案2】:错误很明显,您的 package.json 没有 https 模块。 我不知道你为什么需要这个模块,但如果你需要这个用于 REST API 我建议fetch 或者如果第三方你可以使用axios。
【讨论】:
@b3nj4m1n 请告诉我您的要求。 我正在使用 axios,但我需要通过带有自签名证书的 ssl 连接发出请求(我不能使用免费的在线证书颁发机构),所以根据我在网上阅读的内容,我需要创建一个 axios 实例并传递一个将 rejectUnauthorized 设置为 false 的 https.Agent。如果还有其他方法可以做到这一点,请告诉我。 我建议,您应该针对此问题提出另一个问题,特别提到您想在 react-native 应用程序中执行此操作。以上是关于react-native 包指定了一个主模块 https 模块的主要内容,如果未能解决你的问题,请参考以下文章
已成功找到“Firebase”包。但是,这个包本身指定了一个无法解析的“主”模块字段
如何远程加载 react-native(Android) 包
在解析模块`react-native/Libraries/Core/Devtools/getDevServer`时,发现了Haste包`react-native`