首先需要定位错误来源,Ubuntu系统日志和Node.js应用日志是关键线索:
/var/log目录下的系统日志文件(如syslog、kern.log、error.log)查看与Node.js相关的系统级错误。使用以下命令实时查看:tail -f /var/log/syslog # 实时查看系统日志
cat /var/log/error.log # 查看系统错误日志
node app.js > logs/app.log 2>&1 &),可直接查看指定日志文件:tail -f logs/app.log # 实时查看应用日志(需替换为实际路径)
pm2 logs命令查看应用实时日志(支持多进程):pm2 logs # 查看所有进程日志
pm2 logs app_name # 查看指定进程日志
根据日志中的错误信息,针对性解决以下常见问题:
Cannot find module 'xxx'或fs.write is not a function,需检查依赖是否安装正确或方法调用是否符合API规范。
npm install missing-modulefs模块的异步方法需用writeFile而非write)。EADDRINUSE(地址已使用),说明端口被其他进程占用。
sudo lsof -i :3000(替换为实际端口)kill -9 <PID>(替换为实际进程ID)app.listen(3000)改为app.listen(3001))。UnhandledPromiseRejectionWarning或回调函数未执行,需用async/await或.then().catch()处理异步操作,避免未捕获的Promise rejection。// 错误示例:未处理异步操作
someAsyncFunction().then(data => console.log(data));
// 正确示例:使用async/await
async function run() {
try {
const data = await someAsyncFunction();
console.log(data);
} catch (err) {
console.error('Error:', err);
}
}
run();
// 同步错误捕获
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
process.exit(1); // 强制退出防止应用崩溃
});
// 异步错误捕获
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
// Express错误处理中间件(需放在路由之后)
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
node -v # 查看Node.js版本
npm -v # 查看npm版本
# 更新Node.js(使用NodeSource源)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
node_modules和package-lock.json后重新安装依赖,解决依赖冲突:rm -rf node_modules package-lock.json
npm install
logrotate工具自动分割日志(需配置/etc/logrotate.d/nodejs文件)。sudo chown -R $USER:$USER logs/ # 将logs目录所有权给当前用户
sudo chmod -R 755 logs/ # 设置logs目录权限
node --inspect启动应用,在Chrome浏览器中打开chrome://inspect进行断点调试,定位代码逻辑错误。winston或bunyan等日志库增强日志功能(如分级记录、输出到文件/数据库),便于后续分析。