Skip to Content
Technical Articles
Author's profile photo Tia Xu

无法访问npmjs.org时的变通方法

之所以写这篇文章,是因为许多开发人员和服务所有者(SO,尤其是国外的)以前没有遇到过这个问题,无法正常部署应用和上线服务。因此,我将罗列一些可以解决该问题的方法,供大家使用和参考。

遇到的问题

当你在本地安装Node.js依赖,或将Node.js应用部署到Cloud Foundry环境时,遇到了超时等错误(例如,如下所示),你尝试ping NPM registry来测试连接性,也失败了:

-----> Building dependencies
Prebuild detected (node_modules already exists)
Rebuilding any native modules
rebuilt dependencies successfully
Installing any new modules (package.json)
Error staging application sbf-sample: timed out after 15 minute(s)

默认情况下,Node.js依赖都是从https://registry.npmjs.org库中下载的,这是一个最常用的公开的NPM registry。当这个NPM registry因为任何理由不可访问和连接时,我们可以通过一些配置来解决这个问题。这属于Node.js相关的开发问题,更多说明可通过谷歌来了解。

变通方法

变通方法 1:实现项目自包含(Self-contained)

在将应用程序部署到Cloud Foundry运行时等云环境时,如果你发现从容器中安装依赖时会出现网络不稳定的情况,则可以尝试实现项目的自包含。这意味着你需要预先将所有依赖下载到本地,然后将它们与你的代码代码一起推到Cloud。

package.json同一目录下, 执行以下命令将所有依赖项安装到node_modules文件夹中:

npm i

然后,你再尝试把项目推至云端。

更多详细信息参考:Vendoring App Dependencies

变通方法 2:切换NPM Registry

当然,你可以直接通过切换NPM registry来解决无法访问npmjs.org的问题。你可以通过以下方式进行配置:

  • 执行NPM命令:

    npm config set registry <registry-url>

    这个方法有一些缺点:

    • 每次切换NPM registry时,你都必须回忆和重新输入正确的NPM registry URL。

    • 该方法忽略了NPM registry的配置选项各有不同,例如用户名和密码。在切换到另一个NPM registry时,也必须更改这些选项。

    • 在部署到云端的情况下,你没有机会执行命令对NPM registry进行配置。对于这种情况,你可以使用下一种方法来配置它。

  • 创建一个.npmrc配置文件并设置NPM registry

    如果在将应用程序部署到Cloud Foundry运行时等云环境时遇到该问题,你可以尝试这种方法。

    在项目或者子模块的根目录下,创建一个.npmrc配置文件,包含以下内容:

    registry=<registry-url>
    @<namespace>:registry=<registry-url>
    

    Cloud Foundry运行时将自动识别它,并尝试从你所设置的NPM registry仓库中安装依赖。

    注意:

    • 如果你的项目中包含多个Node.js子模块,你需要为每个模块都维护一个.npmrc配置文件。

    • 在将应用推至Cloud之前,请确保.npmrc没有被包含在.cfignore文件中。

  • 配置Cloud Foundry中的manifest.json文件

    通过环境变量npm_config_registry来配置NPM registry。

    例如:

    ---
    applications:
      - name: broker-tia
        memory: 128M
        env:
          npm_config_registry: <registry-url>
  • 使用npmrc工具

    如果你使用过私有的NPM registry,你就会知道在一堆不同的.npmrc文件之间切换和手动管理NPM registry URL的痛苦。别再让这成为问题了!npmrc工具可以解决这个问题。它使你可以非常简单地用一个特定的命名版本来切换你的.npmrc

    更多详细说明,可阅读:https://www.npmjs.com/package/npmrc

你可以根据你的偏好和目的选择合适的NPM registry。例如:

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.