需完成代码编写、依赖管理、环境配置、api接口实现、错误处理、日志记录、进程守护和部署准备全流程:初始化项目结构并设src/index.js为入口,改package.json中"main"字段;启用es模块或配置nodemon热重载;用原生http启动服务,监听环境端口,实现/health健康接口;引入pino结构化日志并捕获全局错误;编写dockerfile,使用npm ci构建生产镜像;最后本地构建并验证健康接口返回200及正确响应头。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

用Cursor开发一个可上线的Node.js项目,需要完成代码编写、依赖管理、环境配置、API接口实现、错误处理、日志记录、进程守护和部署准备全流程,不能只停留在本地能跑通。
初始化项目结构
在Cursor中新建文件夹,右键打开终端,执行 npm init -y 生成基础 package.json。
手动创建 src/ 目录,把入口文件定为 src/index.js,避免直接写在根目录——否则后续部署时Docker或PM2容易因路径错乱找不到主文件。
编辑 package.json,将 "main" 字段改为 "src/index.js",【不改这里会导致线上启动时报错“Cannot find module”】。
配置ES模块与热重载
方法一:在 package.json 中添加 "type": "module",启用原生ESM支持。
方法二:安装 nodemon 并配置脚本:"dev": "nodemon --watch src --ext js,jsx --exec node --no-warnings src/index.js"。这一步必须加 --no-warnings,否则Node 20+会因 ExperimentalWarning 频繁刷屏干扰调试。
运行 npm run dev,修改任意 .js 文件保存后自动重启,确认控制台输出 “Server running on http://localhost:3000”。
实现基础HTTP服务
第一步:在 src/index.js 中用原生 http 模块启动服务,不引入Express等框架——减少线上依赖面,降低安全扫描风险。
第二步:监听 process.env.PORT || 3000,强制读取环境变量端口;若未设置则默认3000,但上线时必须由PaaS平台注入真实端口。
第三步:添加简单路由逻辑,对 GET /health 返回 { "status": "ok", "timestamp": Date.now() },状态码200。这个接口会被云服务商健康检查调用,【返回非200或超时会导致实例被自动下线】。
添加生产级日志与错误捕获
安装 pino:npm install pino,不用 console.log——它无法区分日志级别且不支持结构化输出。
在 src/logger.js 中初始化实例:const logger = pino({ level: process.env.LOG_LEVEL || 'info' }),并导出 logger。
在 src/index.js 顶部导入 logger,替换所有 console.* 调用,例如请求日志写成 logger.info({ method, url, ip: req.socket.remoteAddress }, 'incoming request')。
给服务器实例绑定 'error' 事件,调用 logger.error(err) 后调用 process.exit(1),防止未捕获异常导致进程静默挂起。
编写Docker部署所需文件
在项目根目录创建 Dockerfile,内容如下:
FROM node:20-alpineWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionCOPY src ./srcEXPOSE 3000ENV NODE_ENV=productionCMD ["node", "src/index.js"]
关键点:必须用 npm ci 而非 npm install,确保依赖版本与 package-lock.json 严格一致;--only=production 排除开发依赖,减小镜像体积。
准备上线前最后验证
在Cursor终端中执行:docker build -t my-node-app . && docker run -p 3000:3000 my-node-app。
访问 http://localhost:3000/health,确认返回JSON且状态码为200。
用 curl -I http://localhost:3000/health 查看响应头,确认包含 Content-Type: application/json 和 Connection: keep-alive。











