问题描述
- 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]'
]
}
是否需要设置配置才能使其正常工作?
解决方法
您可以指定 NODE_PATH
环境变量而不是符号链接。
引用 the NodeJS documentation
: “在定义当前模块解析算法之前,NODE_PATH 最初是为了支持从不同路径加载模块而创建的。”
NODE_PATH
仍然受支持,并且可以完全适合您的用例 IMO。如果需要,不要忘记修复文件权限(使用 chmod
和 chown
)。
例如:
export NODE_PATH="/data/node_modules"
node <your script>
此外,您可以要求 npm 或 yarn 在此目录中安装模块。
使用纱线:
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_modules
是 data/node_modules
的镜像
这非常方便,因为您甚至可以从您的网络挂载文件,如果您希望它在重启后永久有效,您可以在 /etc/fstab
中添加一个条目。