Debian环境下JavaScript(Node.js)日志常见问题及解决方案
常见场景:代码中存在语法结构错误,如缺少括号、引号、分号,或使用了非法字符(如中文标点)。
日志表现:日志中会出现SyntaxError: Unexpected token、SyntaxError: Unterminated string constant等提示,伴随错误发生的具体文件路径和行号。
解决方法:
常见场景:尝试访问未声明的变量或函数,或在严格模式下使用未声明的全局变量。
日志表现:日志中会出现ReferenceError: variableName is not defined,明确指出未定义的变量名。
解决方法:
var、let或const声明变量(推荐const用于不变量,let用于可变量);userName误写为userNmae);var声明)。常见场景:对非预期类型的值执行操作,如访问undefined或null对象的属性、调用非函数类型的值。
日志表现:日志中会出现TypeError: Cannot read property 'x' of undefined、TypeError: func is not a function等提示。
解决方法:
?.)或判断对象是否存在(如if (obj && obj.x) { ... });typeof func === 'function');常见场景:数值超出允许的范围,如创建负长度的数组、递归调用栈溢出。
日志表现:日志中会出现RangeError: Invalid array length、RangeError: Maximum call stack size exceeded等提示。
解决方法:
new Array(10)而非new Array(-10));if (n <= 0) return;);常见场景:项目依赖的Node.js模块未安装或安装路径不正确。
日志表现:日志中会出现Error: Cannot find module 'moduleName',明确指出缺失的模块名称。
解决方法:
npm install moduleName安装缺失的模块;package.json管理依赖,运行npm install安装所有依赖;node_modules目录是否存在,确保模块安装路径正确(如全局模块需通过npm install -g moduleName安装)。常见场景:Node.js进程没有权限访问日志文件、配置文件或端口(如低于1024的端口)。
日志表现:日志中会出现Error: EACCES: permission denied、Error: listen EACCES: permission denied :::80等提示。
解决方法:
sudo提升权限运行应用(仅用于开发环境,生产环境不推荐);sudo chmod 755 /path/to/logfile);sudo chown -R youruser:yourgroup /path/to/app);setcap命令允许Node.js绑定低端口(如sudo setcap 'cap_net_bind_service=+ep' /usr/bin/node)。常见场景:日志文件持续增长,占用大量磁盘空间,导致系统性能下降或无法写入新日志。
日志表现:磁盘空间不足(df -h显示磁盘使用率过高),日志文件大小超过GB级别。
解决方法:
logrotate工具配置日志轮转(如每天生成新日志、保留7天日志、压缩旧日志);logrotate配置(/etc/logrotate.d/nodejs):/var/log/nodejs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 644 youruser yourgroup
}
winston或pino等日志库的内置轮转功能(如winston-daily-rotate-file)。常见场景:Node.js版本与依赖库不兼容、前端代码不兼容目标浏览器。
日志表现:日志中出现Error: Cannot find module 'core-js'、SyntaxError: Unexpected token 'export'(ES6模块语法不被支持)等提示。
解决方法:
node -v查看版本,通过nvm或NodeSource安装指定版本);npm update),检查package.json中的engines字段;babel转译ES6+语法(如@babel/preset-env),添加core-js和regenerator-runtime Polyfill支持旧浏览器。常见场景:日志污染(模块日志与业务日志混合)、日志级别设置不当(如开发环境用info、生产环境用debug)、异步日志阻塞。
解决方法:
debug模块控制模块日志输出(如require('debug')('moduleName'),通过DEBUG=moduleName node app启用);debug,生产环境用warn或error,如process.env.NODE_ENV === 'production' ? 'warn' : 'debug');winston或pino等异步日志库,避免日志记录阻塞业务线程;winston的json()格式化)。