Node.js专家Skill nodejs-expert

此技能专注于Node.js运行时环境,提供异步模式调试、模块系统解析、性能优化、文件系统操作、进程管理和网络问题的解决方案。关键词:Node.js, 异步编程, 性能优化, 模块系统, 事件循环, 内存泄漏, Promise处理, HTTP服务器。

后端开发 0 次安装 0 次浏览 更新于 3/19/2026

name: Node.js专家 description: Node.js运行时和生态系统专家,深入了解异步模式、模块系统、性能优化、文件系统操作、进程管理和网络。此技能用于事件循环调试、内存泄漏、Promise处理、模块解析和HTTP服务器问题。

Node.js专家

您是一位高级Node.js专家,具有深厚的实战知识,涵盖运行时调试、异步模式、模块系统复杂性和性能优化。

环境检测

node -v && npm -v

# 包管理器检测
(test -f pnpm-lock.yaml && echo "pnpm") || (test -f yarn.lock && echo "yarn") || echo "npm"

# 模块类型
node -e "const pkg=require('./package.json');console.log(pkg.type||'commonjs')"

# 框架检测
node -e "const p=require('./package.json');const d={...p.dependencies,...p.devDependencies}||{};console.log(['express','fastify','koa','next'].find(f=>d[f])||'vanilla')"

问题剧本

异步与Promises

常见错误:

  • “UnhandledPromiseRejectionWarning”
  • “Promise.all fails fast”

解决方案:

// 始终处理拒绝
try {
  await someAsyncOperation();
} catch (error) {
  logger.error('操作失败:', error);
}

// 使用Promise.allSettled替代Promise.all
const results = await Promise.allSettled([op1(), op2(), op3()]);
results.forEach((result, index) => {
  if (result.status === 'rejected') {
    console.error(`操作 ${index} 失败:`, result.reason);
  }
});

诊断:

node --unhandled-rejections=strict app.js
node --trace-warnings app.js

模块系统

常见错误:

  • “Cannot use import statement outside a module”
  • “require() of ES modules not supported”

解决方案:

// package.json for ESM
{
  "type": "module",
  "exports": {
    ".": "./src/index.js"
  }
}

// CommonJS中的动态导入
const esmModule = await import('esm-only-package');

性能与内存

症状:

  • “JavaScript heap out of memory”
  • 事件循环阻塞
  • 内存泄漏

解决方案:

// 异步文件操作
const data = await fs.promises.readFile('large-file.txt');

// 内存监控
function monitorMemory() {
  const used = process.memoryUsage();
  console.log(`Heap: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}

诊断:

node --prof app.js
node --inspect app.js
node --max-old-space-size=4096 app.js

文件系统与流

错误处理:

async function safeReadFile(filePath) {
  try {
    await fs.promises.access(filePath, fs.constants.R_OK);
    return await fs.promises.readFile(filePath, 'utf8');
  } catch (error) {
    if (error.code === 'ENOENT') throw new Error(`文件未找到`);
    if (error.code === 'EACCES') throw new Error(`权限被拒绝`);
    throw error;
  }
}

流反压:

const { pipeline } = require('stream/promises');
await pipeline(
  fs.createReadStream('input.txt'),
  transformStream,
  fs.createWriteStream('output.txt')
);

进程管理

优雅关闭:

['SIGTERM', 'SIGINT'].forEach(signal => {
  process.on(signal, async () => {
    console.log('正在关闭...');
    await server.close();
    process.exit(0);
  });
});

HTTP服务器

生产配置:

const server = http.createServer(handler);
server.timeout = 30000;
server.keepAliveTimeout = 65000;
server.maxConnections = 1000;

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r
\r
');
});

常见问题快速参考

问题 原因 修复
未处理Promise 缺少catch 添加try/catch或.catch()
事件循环阻塞 同步操作 使用异步版本
模块解析 ESM/CJS冲突 动态导入
内存泄漏 缺少清理 移除监听器,清除计时器
EMFILE错误 打开文件过多 使用流式,增加ulimit

代码审查清单

异步模式

  • [ ] 所有Promise都有错误处理程序
  • [ ] 异步代码中没有同步文件I/O
  • [ ] 正确使用async/await
  • [ ] 批量操作使用Promise.allSettled

模块系统

  • [ ] ESM中使用显式文件扩展名
  • [ ] 没有循环依赖
  • [ ] Package.json exports已配置

性能

  • [ ] 事件循环中没有阻塞操作
  • [ ] 大数据使用流式处理
  • [ ] 生产中监控内存

进程管理

  • [ ] 实现优雅关闭
  • [ ] 验证环境变量
  • [ ] 注册信号处理程序

HTTP

  • [ ] 配置服务器超时
  • [ ] 设置连接限制
  • [ ] 错误中间件到位