Node.js 错误处理要覆盖同步、异步、全局三个场景。同步代码直接用try/catch捕获异常,拦截即时报错。异步代码中,Promise 用.catch(),async/await搭配try/catch最简洁;传统回调遵循错误优先规则,先判断错误参数。全局必须监听两个事件:uncaughtException捕获未处理的同步异常,unhandledRejection捕获遗漏的 Promise 错误。还可以自定义错误类,区分业务和系统错误,统一返回格式并记录日志。这套方案能全覆盖错误,避免服务因未捕获异常直接崩溃,保证程序稳定运行。
Node.js 异常处理有成熟的最佳实践,核心是规范化、全覆盖。首先统一错误格式,自定义错误类,包含状态码、错误码和描述,方便前后端对接。同步必用try/catch,异步全用async/await+try/catch,抛弃嵌套回调。全局挂载异常监听,防止服务意外挂掉。用中间件集中处理 HTTP 接口错误,统一返回响应。绝对不隐藏错误,所有异常都要记录堆栈日志。关键业务做降级兜底,异常时返回备用数据。集群场景下,主进程监听子进程错误并自动重启。遵循这些规则,错误可追踪、易维护,服务健壮性大幅提升。
Node.js 安全加强要全方位防护常见漏洞。首先用helmet库设置安全响应头,防范 XSS 攻击;用户输入全部转义过滤,杜绝脚本注入。防 CSRF 使用 Token 校验,仅允许可信请求。数据库操作用参数化查询,避免 SQL 注入。密码用bcrypt哈希存储,绝不明文保存。强制启用 HTTPS,禁用 HTTP 明文传输。用express-rate-limit限制请求频率,防暴力破解。严格验证所有用户输入,过滤非法字符。定期扫描依赖漏洞,隐藏生产环境错误堆栈,配置精准的 CORS 规则。层层防护就能规避绝大多数 Web 安全风险。
域(domain)模块是 Node.js 早期的异步错误捕获工具,能把多个异步操作包裹起来,统一捕获上下文内的异常,解决早期异步错误难以追踪的问题。但它存在致命缺陷:无法稳定捕获所有异步错误,会造成严重的内存泄漏,破坏 V8 垃圾回收机制,而且 API 复杂、稳定性极差,官方难以修复。随着Promise、async/await和全局异常监听的普及,有了更安全可靠的错误处理方案。域模块从 Node.js v14 开始被彻底废弃,官方明确禁止在任何项目中使用。
Node.js 使用 TypeScript 非常简单:先初始化项目,安装typescript、@types/node、ts-node等依赖,编写tsconfig.json配置编译规则。编写.ts代码,开发环境用ts-node直接运行,生产环境用tsc编译为 JS 再启动。它的优势突出:静态类型检查在编译时拦截错误,避免运行时异常;支持最新 ES 语法,兼容低版本 Node;智能提示提升开发效率,减少 bug;接口、泛型等特性让代码更规范,大型项目可维护性极强。是现代 Node.js 企业级开发的标配。
Node.js 通过环境变量管理配置,实现配置与代码解耦,保护敏感信息。基础用法是直接通过process.env访问系统环境变量。项目开发主流用dotenv库,创建.env文件存储端口、数据库地址、密钥等配置,调用dotenv.config()即可加载到环境变量中。可以分模块管理配置,统一导出使用,敏感配置绝不提交到 Git,只保留示例文件。这种方式不用修改代码就能切换配置,适配不同场景,安全又便捷,是 Node.js 配置管理的标准方案。
用环境变量区分多环境,核心依靠NODE_ENV标识。开发、测试、生产环境分别设置为development、test、production。项目中配合dotenv加载对应环境的配置文件,如.env.development、.env.production,根据变量自动匹配。代码中判断process.env.NODE_ENV,加载不同的数据库、日志、接口配置。这种方式完全隔离环境配置,无需改动业务代码,一键切换,还能避免开发环境的调试配置泄露到生产环境,安全高效。
中间件是 Express、Koa 等 Web 框架的核心,本质是处理请求和响应的函数,串联成管道执行。它接收请求、响应和next三个参数,工作流程是:请求到达后,按定义顺序执行中间件,每个中间件可以处理数据、校验权限、打印日志,调用next()就交给下一个中间件,不调用则终止请求。中间件分为应用级、路由级、错误处理等类型,能把跨业务的通用逻辑抽离出来。它让业务代码只关注核心功能,是 Web 服务扩展功能、简化代码的核心机制。
Node.js 实现文件上传最常用 Express 的multer中间件,简单高效。先安装multer,配置存储路径、文件名规则,限制文件大小和类型。创建上传路由,指定单文件或多文件上传,multer会自动解析form-data格式的上传数据,将文件保存到本地或内存。上传完成后可获取文件信息,做压缩、转存云存储等二次处理。也可以使用formidable库适配更多场景。一定要限制文件规格,过滤非法类型,防止恶意上传攻击服务,最后返回文件访问链接即可。
跨域是浏览器同源策略导致的请求限制,Node.js 处理非常简便。Express/Koa 框架直接使用cors中间件,一行代码开启基础跨域。进阶配置可指定允许的域名、请求方法、请求头,支持携带 Cookie。手动处理则在响应头添加Access-Control-Allow-Origin等字段。复杂请求会先发OPTIONS预检请求,服务端需正常响应。生产环境严禁使用*通配符,仅允许可信域名跨域。正确配置后,就能完美解决前端跨域问题,是 Web 服务的必备配置。
服务端渲染(SSR)是 Node.js 在服务端生成 HTML 直接返回浏览器,提升首屏速度和 SEO 效果。传统方案用 Express 配合 EJS、Pug 等模板引擎,编写模板文件,服务端注入数据渲染成 HTML 返回。现代框架用 Next.js(React)、Nuxt.js(Vue),基于 Node.js 封装,零配置实现 SSR,支持数据预取、路由适配。SSR 流程:请求→服务端取数据→渲染 HTML→返回浏览器。优势是首屏加载快、搜索引擎易收录,适合官网、电商等业务,Node.js 是 SSR 的最佳运行环境。
会话管理用于记录用户登录状态,Node.js 有两种主流方案。传统 Session:用express-session中间件,服务端存储用户信息,生成唯一 ID 存入客户端 Cookie,生产环境用 Redis 持久化,避免内存丢失。现代 JWT:登录后生成加密 Token,客户端存储,每次请求携带,服务端校验解析,无状态无需存储。Session 适合传统 Web 项目,JWT 适合前后端分离、微服务。管理要点:设置过期时间,加密存储,防止会话劫持,生产环境禁用内存存储,保证安全和持久化。
OAuth 是第三方登录标准,Node.js 用passport库实现最便捷。安装passport及对应平台策略(GitHub、微信、支付宝等),在第三方平台申请应用 ID 和密钥。配置策略参数,定义授权回调,获取用户信息后自动完成登录 / 注册。流程:前端点击第三方登录→跳转授权页→回调 Node.js 服务→获取用户信息→生成会话 /Token→返回前端。passport支持全版本 OAuth 协议,配置简单、扩展性强,是 Node.js 实现第三方登录的标准方案。
基于角色的访问控制(RBAC)是企业级应用的标准权限方案,Node.js 实现很清晰。构建用户、角色、权限三层结构,如管理员、普通用户、访客。编写鉴权中间件,请求时获取用户身份,查询对应角色和权限,校验当前接口是否允许访问,无权限直接返回 403。中间件统一拦截,无需在每个路由写校验逻辑。配合 Session/JWT 获取用户信息,权限配置存在数据库,可动态修改。这种方式权限管理灵活、易扩展,完美适配中后台管理系统。
Node.js 测试主流用 Jest、Mocha+Chai。单元测试针对单个函数、工具类,隔离依赖,用 Mock 模拟外部接口和数据库,测试独立逻辑的输入输出。集成测试测试模块协作、接口、数据库交互,启动服务发送真实请求,校验响应和数据变化。流程:编写测试用例→运行测试→生成覆盖率报告。Jest 零配置,自带断言和 Mock,适合大部分项目。保证核心逻辑测试覆盖率达标,上线前自动化测试,提前发现 bug,大幅提升代码质量和服务稳定性。
依赖注入(DI)是解耦代码的核心设计模式,Node.js 中 TypeScript 结合 InversifyJS 使用最广泛,NestJS 框架原生内置 DI。核心是将类的依赖外部传入,而非内部new创建。先定义服务类并标记可注入,创建容器注册服务,在控制器中通过构造函数注入依赖,无需手动实例化。DI 的优势是解耦代码,方便单元测试 Mock 依赖,便于维护扩展。不用 DI 会导致代码耦合严重、难以测试,DI 让大型项目结构清晰,是企业级开发的必备技能。
国际化(i18n)和本地化(l10n)让应用支持多语言,Node.js 用i18next、express-i18n库实现。创建多语言配置文件,存储中文、英文等对应文案。配置中间件,根据请求头、URL 参数或 Cookie 自动切换语言。在接口和模板中调用翻译函数,获取对应文案,支持动态参数、日期格式化。可配合前端实现全栈国际化,服务端负责接口、邮件、短信的多语言。配置简单、扩展性强,快速适配全球用户。
Node.js 优化长列表核心是绝不全量加载数据。首选数据库分页查询,用limit/offset返回单页数据;大数据量用游标分页,避免偏移性能损耗。处理文件、数据库长列表使用流,分块读取处理,不占用大量内存。禁用全量查询和全量返回,减少数据库和网络开销。给查询字段加索引,热点列表数据用 Redis 缓存。这些方案让长列表处理内存占用低、响应快,不会阻塞事件循环,轻松适配海量数据场景。
Node.js 性能优化从代码、架构、部署三维度入手。代码层:用async/await替代回调,避免阻塞事件循环;CPU 密集任务交给 C++ 扩展或子进程;Redis 缓存热点数据,减少数据库查询。架构层:Cluster 启用多进程利用多核;拆分微服务,独立扩容瓶颈服务。部署层:PM2 管理进程,负载均衡;启用数据压缩和 HTTP/2;CDN 加速静态资源。定期更新依赖,监控性能瓶颈。全方位优化后,应用并发更高、响应更快、资源占用更低。
内存管理 + 性能优化是 Node.js 服务稳定的关键。内存管理:避免滥用全局变量,及时解除对象引用;用流处理大文件,拒绝全量加载;使用 Buffer 堆外内存,避开 V8 限制;定期清理缓存,监控内存使用。性能优化:Cluster 利用多核 CPU,PM2 守护进程;坚持异步非阻塞编程,远离 CPU 密集任务;数据库加索引,Redis 缓存;启用 HTTP 缓存和响应压缩。防范内存泄漏:及时清理定时器、事件监听,合理使用闭包。配合监控工具定位瓶颈,持续优化保证服务长期稳定。
Node.js 是微服务架构的理想运行时,核心角色是轻量服务载体,每个微服务独立开发、部署、扩展。它的优势极为突出:轻量高效,启动速度快、资源占用低,适合大规模实例部署;非阻塞 I/O 模型,高并发处理能力强,适配 API 网关、聚合服务;模块化生态完善,快速开发业务微服务;支持 TypeScript,大型微服务集群易维护;无缝适配 Docker、K8s,云原生兼容性拉满。事件驱动 + 轻量部署的特性,让 Node.js 微服务弹性伸缩能力极强,是云原生微服务的核心技术。