从四步重构node.js项目结构:先识别文件杂乱与跨层引用问题,再用ai生成标准分层骨架,接着迁移路由与逻辑至src目录并解耦控制器与服务层,最后通过.cursorrules文件强制约束新结构。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当你在Cursor中打开一个Node.js项目,发现文件杂乱、模块耦合严重、路由分散难维护,想快速理清结构并建立可扩展的骨架,就从这四步开始。
识别当前结构缺陷
打开项目根目录,在侧边栏右键 → “Open in Terminal”,执行:find . -name "*.js" | head -20。如果输出里大量出现index.js、app.js、server.js混在根目录或routes/下无子目录,说明结构已失控——这是后续重构的起点,不是待修复的错误。
用Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS)→ 输入“Show Cursor Logs”,滚动到最近10行,查找含require(或import ... from但路径深度≤2的警告行。这类日志往往暴露了跨层级直接引用,比如routes/user.js直接require('../../utils/db'),这是解耦失败的典型信号。
用AI一键生成分层骨架
在任意空白JS文件中输入以下提示词,光标停在末尾,按Tab:
【请为Express项目生成标准分层结构代码,包含:config/(环境变量、数据库连接)、src/(含controllers/、routes/、services/、models/、middleware/)、types/(TS定义,若启用)、.env.example。所有路径使用相对导入,禁止硬编码绝对路径。】
接受补全后,选中全部生成代码 → 右键 → “Move to Folder” → 新建文件夹refactor-skeleton。这一步不覆盖原文件,只为提供可比对的基准模板。
迁移与重定向旧逻辑
第一步:把原routes/下所有*.js文件剪切到新src/routes/,同时打开每个文件,将顶部const router = express.Router();下方第一行改为const { getUsers, createUser } = require('../controllers/user');(按实际函数名调整)。【不要保留原require指向../models或../utils的路径,必须先移到src/controllers再统一改】
诊断并恢复通过 SSH 隧道连接的 OpenClaw 节点。用于解决配对必需错误、隧道冲突、远程端点错误以及 SSH 目标配置错误等问题。
第二步:打开原app.js或server.js,删除所有app.use('/api/users', require('./routes/user'))类语句,替换成:
const userRoutes = require('./src/routes/user');app.use('/api/users', userRoutes);
第三步:在src/controllers/user.js中,把原路由处理函数(如function getUsers(req, res))抽离为纯业务函数,例如exports.getUsers = async () => { /* 原逻辑,但移除req/res操作 */ };再新建src/services/userService.js,把数据库查询等副作用操作移入其中——【此时控制器只做参数校验和响应包装,服务层才真正调用DB】
配置Cursor规则锁定新结构
在项目根目录创建.cursorrules文件,粘贴以下内容:
{"rules": [{"id": "no-root-js", "pattern": "^(?!src|config|types|\.env).*\.js$", "message": "JS文件禁止放在项目根目录,请移入src/或config/"}{"id": "route-controller-only", "pattern": "^src/routes/.*\.js$", "message": "路由文件只能require src/controllers/下的模块,禁止直连models或services"}{"id": "controller-no-db", "pattern": "^src/controllers/.*\.js$", "message": "控制器禁止import或require数据库驱动、连接实例或SQL语句"}]}
保存后,Cursor会在你试图在src/routes/auth.js里写const db = require('pg')时实时报错。这比文档约束更有效——结构一旦写错,立刻拦截。










