需先完成Devin的Git仓库授权(点击Settings→Code Repositories→Authorize),否则无法读取源码;迁移须严格四阶段执行:①扫描含Express路由/中间件的.js文件;②生成同路径.ts文件并添加Request/Response类型;③替换为Fastify实例,改用addHook和get/post注册;④新增tsconfig.json与jest.config.ts,并为带:path路由添加schema校验、统一errorHandler。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要把一个用JavaScript写的Express后端项目,整体迁移到TypeScript + Fastify架构,同时保持所有API行为不变、路由逻辑一致、错误处理机制可追溯。这要求AI不仅改语法,还要理解框架生命周期、中间件注入方式、类型推导边界和错误传播路径。
确认Devin对目标仓库与分支的访问权限
登录app.devin.ai → 进入你的项目空间 → 点击右上角「Settings」→ 在「Code Repositories」中检查Git仓库状态是否为绿色「Connected」。若显示「Pending authorization」,必须点击「Authorize」完成OAuth流程。【未完成此步,Devin无法读取任何源码,后续所有指令将返回空结果】
Devin默认只读取main或master分支。如果你要在dev或feature/typescript-migration分支上执行迁移,请在每条指令开头明确声明分支名,例如:“请在feature/typescript-migration分支上执行以下操作”。
构造分阶段语言转换指令
在Devin Web控制台输入框中,一次性发送完整指令,不要拆成多轮提问:
“请将本项目从JavaScript + Express迁移至TypeScript + Fastify,严格遵循以下四阶段执行:① 第一阶段:扫描src/目录下所有.js文件,识别含app.use()、app.get()/post()、res.json()、next()调用的文件;② 第二阶段:为每个匹配文件生成对应.ts文件,保留原路径结构(如src/routes/user.js → src/routes/user.ts),添加基础TS类型注解(Request、Response、NextFunction);③ 第三阶段:将Express app实例替换为Fastify实例,重写所有路由注册方式(app.get → fastify.get),中间件需改用fastify.addHook('onRequest')或fastify.decorateRequest();④ 第四阶段:在根目录新增tsconfig.json(含"target": "ES2020", "module": "commonjs", "strict": true, "esModuleInterop": true)及jest.config.ts(适配TS测试)。”
这个指令强制Devin按序推进,避免它跳过中间层直接生成不可运行的TS骨架。如果只写“转成TS”,Devin可能只加了.d.ts声明文件却不改运行时逻辑,导致编译通过但启动报错。
框架升级中的关键替换规则
方法一:Express中间件 → Fastify Hook
将app.use((req, res, next) => { ... })替换为fastify.addHook('onRequest', async (request, reply) => { ... })。注意:Fastify没有next()机制,错误必须通过throw new Error()或reply.code(500).send()显式抛出或响应。
方法二:Express路由参数 → Fastify Schema校验
将app.get('/user/:id', ...)改为fastify.get('/user/:id', { schema: { params: { id: { type: 'string' } } } }, ...)。这一步Devin会自动补全Zod或JSON Schema定义,但【若原Express路由未做参数校验,Devin不会主动添加,需在指令中明确要求“为所有带:path参数的路由添加schema校验”】。
方法三:错误处理器统一收口
删除Express风格的app.use((err, req, res, next) => { res.status(500).json(...) }),改为Fastify全局错误处理:fastify.setErrorHandler((error, request, reply) => { reply.code(error.statusCode || 500).send({ code: error.statusCode || 500, message: error.message, data: null }) })。
验证重构结果并生成迁移报告
第一步:等待Devin输出待修改文件列表(如src/app.js、src/middleware/auth.js、src/controllers/product.js)及每处变更的diff对比。
第二步:检查Devin是否在src/types/index.d.ts中补充了全局类型声明(如declare namespace NodeJS { interface Global { __dirname: string } })。若缺失,手动添加,否则tsc编译会报global.__dirname类型错误。
第三步:运行npx tsc --noEmit && npm run dev,确认TS编译通过且服务可启动。
第四步:执行curl -X GET http://localhost:3000/health,验证基础路由返回格式是否仍为{code:200,message:"success",data:null}——这是你之前统一过的标准响应结构,不能因框架切换而丢失。

















