如何跨磁盘分区要求节点模块?

  • Node.js 版本:14.15.0
  • 操作系统:Raspbian
  • 范围(安装、代码、运行时、元数据、其他?):需要

我有一个在 Raspberry Pi 4 上运行的 Node 程序。我最近开始使用名为 Mender 的 OTA 部署系统将更新推送到远程 RPis 上的代码。 Mender 创建了一个分区系统,该系统使用两个 3.5GB 分区,一个作为主分区,另一个作为部署失败时的回滚。它有一个第三个分区 /data,在我的例子中大约是 20GB,用于需要在更新之间保留的内容。

我无法将整个应用程序及其所有节点模块依赖项放入 3.5GB 分区。因此,我将 node_modules 目录移动到 /data 分区并创建了一个指向我的项目目录 (home/pi/myProject) 的符号链接。这适用于模块安装,但是当我尝试从我的项目中 require 一个已安装的模块时,会抛出错误;

internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module '@google-cloud/pubsub'
Require stack:
- /home/pi/myProject/pwrMngmnt.js
- /home/pi/myProject/[eval]
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/myProject/pwrMngmnt.js:3:20)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19) {
  code: 'MODULE_NOT_FOUND',requireStack: [
    '/home/pi/myProject/pwrMngmnt.js','/home/pi/myProject/[eval]'
  ]
}

是否需要设置配置才能使其正常工作?

longfeimicu 回答:如何跨磁盘分区要求节点模块?

您可以指定 NODE_PATH 环境变量而不是符号链接。 引用 the NodeJS documentation : “在定义当前模块解析算法之前,NODE_PATH 最初是为了支持从不同路径加载模块而创建的。”

NODE_PATH 仍然受支持,并且可以完全适合您的用例 IMO。如果需要,不要忘记修复文件权限(使用 chmodchown)。

例如:

export NODE_PATH="/data/node_modules"
node <your script>

此外,您可以要求 npmyarn 在此目录中安装模块。

使用纱线

yarn install --modules-folder /data/node_modules

使用 npm

mkdir -p /data/node_modules
npm install --prefix /data

可能的相关问题:

,

这是基本结构

-|- data
 |- myProject

创建两个文件夹node_modules,一个在源,一个在目标

mkdir myProject/node_modules
mkdir data/node_modules
sudo mount --bind data/node_modules/ myProject/node_modules/

你现在应该有这样的东西

-|- data -|- node_modules 
 |- myProject -|- node_modules
               |- index.js
               |- package.json   

现在 myProject/node_modulesdata/node_modules 的镜像 这非常方便,因为您甚至可以从您的网络挂载文件,如果您希望它在重启后永久有效,您可以在 /etc/fstab 中添加一个条目。

本文链接:https://www.f2er.com/1206832.html

大家都在问