环境变量是Node.js配置的核心,常见问题包括变量未设置、路径错误或敏感信息泄露。
printenv命令列出所有环境变量,确认NODE_ENV(开发/生产模式)、PORT(应用端口)、API_KEY(第三方服务密钥)等关键变量是否存在。.env文件加载:若使用dotenv库,确保项目根目录有.env文件(内容如NODE_ENV=development\nPORT=3000),且在入口文件(如app.js)顶部调用require('dotenv').config()。若加载失败,可通过console.log(require('dotenv').config())输出错误信息(如文件路径错误)。NODE_ENV=development node app.js;永久设置(对所有终端有效):将export NODE_ENV=development添加到~/.bashrc或~/.bash_profile,然后运行source ~/.bashrc使更改生效。版本不兼容是常见配置问题,可能导致依赖安装失败或应用无法启动。
node -v(应输出如v18.12.1)和npm -v(应输出如9.6.7),确认版本符合应用要求(如项目package.json中的engines字段指定"node": ">=16.0.0")。nvm(Node Version Manager)管理多版本。安装nvm:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash,然后运行nvm install 18(安装最新18.x版本)和nvm use 18(切换至该版本)。日志是调试的“眼睛”,可通过日志快速定位配置错误。
winston、morgan等日志库,检查日志文件(如logs/error.log)中的错误信息(如Error: listen EADDRINUSE: address already in use :::3000,表示端口被占用)。pm2管理应用时,运行pm2 logs查看实时日志;若未使用pm2,可通过tail -f /path/to/app.log动态跟踪日志。sudo tail -f /var/log/syslog(Ubuntu/CentOS)或journalctl -u your-service-name(systemd管理的服务)。对于逻辑错误(如变量未定义、条件判断错误),需使用调试工具逐行执行代码。
node --inspect-brk app.js启动调试(--inspect-brk会在第一行暂停),然后在Chrome浏览器中访问chrome://inspect,点击“Open dedicated DevTools for Node”连接。在Sources面板中找到应用文件,点击行号设置断点,逐步执行(F10)并检查变量值(Scope面板)。.vscode/launch.json文件,配置调试参数:{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug App",
"program": "${workspaceFolder}/app.js",
"env": { "NODE_ENV": "development" },
"skipFiles": ["<node_internals>/**"]
}
]
}
按F5启动调试,支持断点、变量监视(Watch面板)和调用栈查看(Call Stack面板)。依赖缺失或配置文件错误会导致应用无法启动。
npm install安装package.json中的依赖,若出现ERESOLVE unable to resolve dependency tree错误,尝试npm install --legacy-peer-deps(忽略peer依赖冲突)。npm list查看已安装依赖的版本,确认是否符合package.json中的dependencies/devDependencies要求。若需更新,运行npm update package-name。config.js(或config文件夹中的配置文件)是否正确读取环境变量。例如,使用joi验证.env文件:const Joi = require('joi');
const dotenv = require('dotenv');
const envVarsSchema = Joi.object({
NODE_ENV: Joi.string().valid('development', 'production', 'test').required(),
PORT: Joi.number().positive().required()
});
const { error, value } = envVarsSchema.validate(process.env);
if (error) throw new Error(`Config validation error: ${error.message}`);
module.exports = { env: value.NODE_ENV, port: value.PORT };
若配置无效,会抛出明确的错误信息。端口冲突或权限不足是常见运行时配置问题。
sudo netstat -tuln | grep :3000(替换3000为应用端口),若端口被占用,杀死占用进程(kill -9 <PID>)或修改应用端口(如app.set('port', process.env.PORT || 3001))。EACCES: permission denied(如监听1024以下端口),可使用sudo(不推荐,存在安全风险)或修改端口(≥1024);若全局安装包时报错,配置npm使用用户目录:mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
然后使用npm install -g package-name安装全局包。通过以上步骤,可系统性地调试Linux环境下Node.js的配置问题,从环境变量、版本兼容性到日志分析、调试工具使用,覆盖常见配置错误的排查场景。