如何在Linux Azure App Service运行NodeJS?解决fabric模块找不到报错
我的项目在本地Windows电脑上运行完全正常,此前在同一Linux Azure App Service上也正常运行了数月,本地环境与云端使用相同版本的node和npm。
通过VS部署后,我会SSH登录并执行以下命令:
curl -sL https://deb.nodesource.com/setup_16.x | bash apt-get install -y nodejs npm install canvas | npm install fabric
此前这样操作即可正常运行,但现在出现如下错误:
An unhandled exception occurred while processing the request.
InvocationException: Cannot find module 'fabric' Require stack:
- Error: Cannot find module 'fabric' Require stack:
- at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15) 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 module.exports
(anonymous:4:40) at Server. ([eval]:1:2404) at
Generator.next () at [eval]:1:355 at new Promise
() at o ([eval]:1:100)
我已尝试清理npm缓存、删除所有文件重新发布、执行npm install、npm update,加或不加-g参数等操作,但问题仍未解决。
请问有什么解决该报错的方法?同时希望找到无需每次部署后手动SSH执行命令的优化方案。
一、解决"Cannot find module 'fabric'"报错
修正依赖安装命令的语法错误
你当前使用的npm install canvas | npm install fabric中的|是管道符,会将前一个命令的输出作为后一个命令的输入,可能导致npm install fabric未正确执行。应改为用&&串联命令,确保前一个命令成功后再执行下一个:npm install canvas && npm install fabric确保依赖已写入package.json
手动执行npm install不会自动将依赖添加到package.json,部署后项目根目录的node_modules不会被保留(Azure部署会清理旧文件)。需要在本地项目根目录执行:npm install fabric canvas --save提交更新后的
package.json和package-lock.json到代码仓库,这样部署时Azure会自动安装所有依赖。指定Azure App Service的Node版本
无需手动通过脚本安装Node,直接在Azure门户的App Service「配置」→「应用设置」中添加:- 名称:
WEBSITE_NODE_DEFAULT_VERSION - 值:
16.x
保存后Azure会自动使用指定版本的Node环境,避免版本不一致问题。
- 名称:
清理云端缓存并重新安装依赖
通过SSH连接到App Service后执行:cd /home/site/wwwroot rm -rf node_modules package-lock.json npm install也可通过Kudu工具清理部署缓存:进入App Service「高级工具」→「Kudu」→「工具」→「部署工具」→「清理部署缓存」。
二、优化部署流程,无需手动执行SSH命令
依赖托管到package.json
确保所有生产依赖(包括fabric和canvas)都已添加到package.json的dependencies中,Azure的Oryx部署引擎会自动执行npm install完成依赖安装。配置启动脚本(可选)
如果需要自定义部署步骤,可在项目根目录创建.deployment文件,内容如下:[config] command = npm install && npm start部署时Azure会自动执行该命令。
启用自动部署
配置VS或GitHub Actions等CI/CD工具,实现代码提交后自动部署到Azure App Service,完全省去手动操作步骤。
内容的提问来源于stack exchange,提问作者Kevin UK

