折腾 Fastify 和 PM2 多实例日志那点事
记录在 Node.js 中用 Fastify 和 PM2 处理多实例日志管理与负载均衡的配置过程和踩坑经验。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-05 03:15:39 Node.js fs.Stats DEP0180 废弃警告 Webpack
有段时间跑构建,终端里老飘出来 DEP0180: fs.Stats constructor is deprecated。这玩意儿不会把构建搞挂,就是看着难受,而且保不齐哪天 Node 大版本一升就直接报错了。
顺手记一下怎么排查和修掉。
触发这个警告的原因不复杂。Node.js 官方已经明确把 fs.Stats 构造函数标成废弃,现在应该用 fs.stat() 或者 fs.statSync() 返回的 Stats 对象。警告冒出来的地方,要么是你自己项目里直接 new 了 fs.Stats,要么是某个依赖库内部还在用这老写法,比如一些 Webpack 插件。像下面这种代码就会触发:
const fs = require('fs'); const stats = new fs.Stats();
想搞清楚到底哪儿触发的,可以带着 --trace-deprecation 跑一遍构建脚本,堆栈会直接把调用位置打出来。
node --trace-deprecation your-build-script.js
输出差不多长这样: (node:31740) [DEP0180] DeprecationWarning: fs.Stats constructor is deprecated at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
也可以在 Webpack 这类构建工具的输出日志里直接搜 DEP0180 或者 fs.Stats,如果只是依赖库引的,日志里一般会带着包名。
修起来分两种情况。
如果是自己项目里直接调了,把 new fs.Stats() 删掉,改用 fs.stat 就行。异步例子:
const fs = require('fs'); fs.stat('file.txt', (err, stats) => { if (err) throw err; console.log(stats); });
需要异步拿并且想用 await 的,可以走 promises 接口:
const fs = require('fs').promises; async function getFileStats() { try { const stats = await fs.stat('file.txt'); console.log(stats); } catch (err) { console.error('获取文件状态失败:', err); } } getFileStats();
多数时候警告来自某个依赖,比如自定义的 Webpack 插件里用了 new fs.Stats。插件里原本可能是这样写的:
class MyPlugin { apply(compiler) { compiler.hooks.emit.tapAsync('MyPlugin', (compilation, callback) => { const stats = new fs.Stats(); // ... }); } }
得改成用 fs.promises.stat 去拿真实的文件状态对象,像这样:
class MyPlugin { apply(compiler) { compiler.hooks.emit.tapAsync('MyPlugin', async (compilation, callback) => { try { const stats = await fs.promises.stat('output.js'); // 用 stats 做后续操作 } catch (err) { return callback(err); } callback(); }); } }
如果依赖是第三方包,最直接的办法是升级到最新版,一般维护者会跟着修掉。比如 Webpack 和相关 loader、plugin 都可以顺手升一下:
npm install webpack@latest webpack-cli@latest --save-dev
万一暂时没法升,也可以先把这个警告吞掉,但只是临时方案,不推荐一直这么干:
process.on('warning', (warning) => { if (warning.name === 'DeprecationWarning' && warning.code === 'DEP0180') { console.log('忽略fs.Stats废弃警告:', warning.message); } });
修完之后重新 npm run build,确认终端不再输出 DEP0180 就行了。
这警告短期不管它确实没事,但长期看 Node.js 迟早会把废弃的 API 彻底移除,到那时候再蹦出来就是运行时错误了。所以比较稳妥的做法还是先把依赖升到最新,再把项目里所有直接调用 new fs.Stats 的地方都搜一遍改成 fs.stat 或 fs.statSync,有空再翻翻 Node 官方的文档,确保别的废弃 API 也没遗漏。
记录在 Node.js 中用 Fastify 和 PM2 处理多实例日志管理与负载均衡的配置过程和踩坑经验。
记录 Node.js 项目中 path-to-regexp 库抛出 "Missing parameter name" 异常的触发条件、源码层面的原因和修复方式。
path-to-regexp库中“Missing parameter name”TypeError让你抓狂?本文深入源码,揭示异常源于路径字符串中孤立冒号或无效参数名。提供三大修复方案:规范路径定义、强化参数校验、升级库版本。确保系统稳定运行,从此告别这类路径解析错误。
Vue CLI初始化项目时SSL证书验证失败的解决方案,包括临时关闭SSL验证、使用离线模板、升级Vue CLI版本、检查网络环境等方法。通过这些步骤,用户可以解决因SSL证书验证失败导致的模板下载问题。建议用户根据自身情况选择合适的解决方案,并在生产环境中确保SSL证书配置正确。
Node.js中遇到的HTTPS证书过期问题,通常由系统时间错误、服务器证书过期、Node.js环境问题或镜像源证书问题导致。解决方案包括修正系统时间、更新证书、升级Node.js版本、更新CA证书存储等。在开发环境中,可临时绕过证书验证,但需注意安全性。调试时可通过openssl命令检查证书有效期,或使用curl测试连接。长期解决方案建议使用自动化证书管理工具,如Let's Encrypt + Certbot,确保证书及时更新。